2015-03-20 12 views
5

Ad esempio, quando si passa a users/invitations/new, l'unico campo è :email. Mi piacerebbe invitare un utente e, oltre a fornire loro e-mail, fornisco:Come posso invitare utenti (usando devise_invitable) e compilare campi aggiuntivi durante il processo di invito?

  • first_name
  • cognome
  • ruolo
  • azienda (user belongs_to company)

ho creato Users::InvitationsController < Devise::InvitationsController :

class Users::InvitationsController < Devise::InvitationsController 
    private 
    def resource_params 
    params.permit(user: [:email, :invitation_token, :role, :company_id])[:user] 
    end 
end 

e ho aggiunto questi campi a users/invitations/new. L'invito invia bene, ma quando lo accetto e inserisco una password, la mia convalida non riesce a dire che No role is selected (b/c di una convalida).

Come posso impostare questi campi prima di inviare l'invito e farli persistere e salvare quando l'invito è accettato? Grazie!

+0

HI. hai trovato la soluzione per questo? Sto correndo nello stesso problema. grazie – loloso

+0

No, mi dispiace. Ho finito per averli impostati più tardi nel processo – jackerman09

risposta

1

Rails 5

Ecco la mia soluzione utilizzando accepts_nested_attributes_for. Se gli attributi personalizzati sono direttamente sul modello utente, dovresti essere in grado di sostituire profile_attributes: [:first_name, :last_name] con :first_name, :last_name, :role, :company.

Ecco il mio controller.

class InvitationsController < Devise::InvitationsController 
    before_action :update_sanitized_params, only: :update 

    # PUT /resource/invitation 
    def update 
    respond_to do |format| 
     format.js do 
     invitation_token = Devise.token_generator.digest(resource_class, :invitation_token, update_resource_params[:invitation_token]) 
     self.resource = resource_class.where(invitation_token: invitation_token).first 
     resource.skip_password = true 
     resource.update_attributes update_resource_params.except(:invitation_token) 
     end 
     format.html do 
     super 
     end 
    end 
    end 


    protected 

    def update_sanitized_params 
    devise_parameter_sanitizer.permit(:accept_invitation, keys: [:password, :password_confirmation, :invitation_token, profile_attributes: [:first_name, :last_name]]) 
    end 
end 

Dentro la mia forma

<%= f.fields_for :profile do |p| %> 
    <div class="form-group"> 
     <%= p.label :first_name, class: 'sr-only' %> 
     <%= p.text_field :first_name, autofocus: true, class: 'form-control', placeholder: 'First name' %> 
    </div> 

    <div class="form-group"> 
     <%= p.label :last_name, class: 'sr-only' %> 
     <%= p.text_field :last_name, class: 'form-control', placeholder: 'Last name' %> 
    </div> 
    <% end %> 

In user.rb devo

... 
accepts_nested_attributes_for :profile, reject_if: proc { |attributes| attributes[:first_name].blank? } 
Problemi correlati