2013-06-26 4 views
1

Hey je fais une application qui a un système d'invitation. Lorsque vous êtes invité, vous recevez un e-mail vous permettant de vous inscrire en tant qu'utilisateur avec cet e-mail spécifique. J'ai donc voulu que mon formulaire (invitation # show) permette à une personne invitée de compléter son inscription à l'exception d'un champ email. Être comment je connais déjà votre email. Mais cela me dit toujours que le courrier électronique ne peut pas être vide.Créer un utilisateur avec un contrôleur différent

Donc, je pense que lorsque je tente de créer un utilisateur (invitation # show), cela revient toujours à l'utilisateur # create controller. Est-ce mon problème, et si oui, y a-t-il un moyen de changer cela?

invitations contrôleur

class InvitationsController < ApplicationController 
    def new 
     @invitation = Invitation.new 
    end 

    def create 
    @invitation = current_user.invitations.new(params[:invitation]) 
    if @invitation.valid? 
      temp_email = @invitation.email 
     if User.find_by_email(temp_email) 
      flash.now.alert = "This email was already invited!" 
      render "new" 
     else 
      @invitation.save 
      redirect_to root_url, :notice => "Invitation sent!" 
      UserMailer.invitation(@invitation).deliver 
     end 
    else 
     render "new", :notice => "Somehting went wrong!" 
    end 
end 

def show 
    @invitation = Invitation.find_by_invite_token(params[:invite_token]) 
    @user.email = @invitation.email 
    if @user.save 
     @user.email_activation_token = true 
     cookies[:auth_token] = user.auth_token 
     redirect_to root_url, :notice => "Welcome!" 
    else 
     render "new", :notice => "Something went wrong!" 
    end 
end 

    def accept_referral 
     @invitation = Invitation.find_by_invite_token(params[:invite_token]) 
     @invitation.accepted_at = Time.zone.now 
     @invitation.save! 
     if cookies[:auth_token] 
     cookies.delete(:auth_token) 
     end 
     @user = User.new 
     render "show" 
    end 
end 

utilisateurs contrôleur

class UsersController < ApplicationController 
    before_filter :admin_and_user, only: [:destory, :edit, :show] 
    before_filter :admin_user, only: :index 
    def new 
    @user = User.new 
    end 
    def create 
    @user = User.new(params[:user]) 
    if @user.save 
     UserMailer.registration_confirmation(@user).deliver 
     redirect_to root_url, :notice => "Signed up!" 
    else 
     render "new" 
    end 
    end 

# invitation montrent

= form_for @user do |f| 
    - if @user.errors.any? 
    .error_messages 
     %h2 Form is invalid 
     %ul 
     - for message in @user.errors.full_messages 
      %li 
      = message 
    %p 
    = f.label :name 
    = f.text_field :name 
    %p 
    = f.label :password 
    = f.password_field :password 
    %p 
    = f.label :password_confirmation 
    = f.password_field :password_confirmation 

    %p.button 
    = f.submit 

Répondre

1

Au lieu de gérer la création d'utilisateur invité sous forme séparée, peut-être qu'il est préférable d'utiliser toujours les utilisateurs # nouvelles et manutention params [: invite_token] dans, par exemple:

def new 
    @user = User.new 
    @invitation = Invitation.find_by_invite_token(params[:invite_token]) if params[:invite_token].present? 
end 

et la forme doit avoir une hidden_field et conditions retirer email_field, par exemple: (en erb que je ne suis pas à l'aise avec haml)

<% if @invitation.nil? %> 
    <%= f.email_field :email %> 
<% else %> 
    <%= hidden_field_tag :invite_token, @invitation.invite_token %> 
<% end -%> 

enfin, gérer invite_token utilisateurs # créer:

def create 
    @invitation = Invitation.find_by_invite_token(params[:invite_token]) if params[:invite_token].present? 
    params[:user][:email] = @invitation.email unless @invitation.nil? 
    @user = User.new(params[:user]) 
    if @user.save 
    UserMailer.registration_confirmation(@user).deliver 
    redirect_to root_url, :notice => "Signed up!" 
    else 
    render "new" 
    end 
end 

vous pourriez aussi w ant pour sortir le code @invitation à before_filter pour rendre les choses bien rangées et aussi vérifier si @ invitation.email déjà utilisé il

+0

cela ressemble à une bonne idée (hey avez-vous pas répondu à mes questions avant lol) mais je ne peux pas obtenir un lien à l'utilisateur # nouvelle qui maintient params [: invite_token] J'ai essayé redirect_to new_user_path (params [: invite_token]) –

+0

Eh oui, dans le groupe fb :) essayer quand même new_user_path (invite_token: params [: invite_token]) – Roy

+0

Je reçois "email ne peut pas être vide" J'ai regardé la console et j'ai trouvé que @ Invitation.find_by_invite_token (params [: invite_token]) ne fonctionne pas sur l'utilisateur # créer –

Questions connexes