Sunday, April 10, 2016

pass user_id in nested form upon registration and save both models

Leave a Comment

I have a nested form on my Devise registration form, which populates a join table. The join table information is not saving because user_id is nil. This is due to the fact that they are not signed in yet, so I can't pass current_user. How can I pass the user_id to save the join table (Languages Users) in one form?

relevant section of new.html.erb

 <%= form_for(resource, as: resource, url: registration_path(resource)) do |f| %>   <%= devise_error_messages! %>   <div class="field">     <%= f.label :first_name %><br />     <%= f.text_field :first_name, autofocus: true %>   </div>   <%= f.fields_for :languages_users do |lu| %>    <div class="fields">      <%= lu.collection_select(:language_id, Language.order('language ASC').all, :id, :language) %><br>      <%= lu.hidden_field :level, value: 1 %>      <%#= lu.hidden_field :user_id, value: current_user.id %>   <% end %>    </div>    <div class="actions">      <%= f.submit "Sign up" %>    </div>   <% end %> 

registrations_controller.rb

    class Users::RegistrationsController < Devise::RegistrationsController     before_filter :configure_permitted_parameters     def new          build_resource({})           resource.languages_users.build(user_id: current_user)            respond_with self.resource     end   def create     super    end  private  def configure_permitted_parameters         devise_parameter_sanitizer.for(:sign_up) { |u|           u.permit(:email, :password, :password_confirmation, :bio, :location, :last_name, :first_name, :nationality, :avatar, languages_users_attributes: [ :language_id, :user_id, :level]) }   end end 

here are my params:

  {"utf8"=>"✓",  "authenticity_token"=>"v/uM0+B7/XCUKmhyFGoEKqunCllXAK50uZN5f+TDpUsxlnIsgQVPbXhEb1q1P5pmG586iaULRROyarWzAzz12w==",  "user"=>{"first_name"=>"Walsh",  "last_name"=>"Costigan",  "location"=>"w",  "nationality"=>"United States",  "bio"=>"w",  "email"=>"walsh@seamlessdocs.com",  "user"=>{"avatar"=>#<ActionDispatch::Http::UploadedFile:0x007fdd25023f78 @tempfile=#<Tempfile:/var/folders/cn/l75pvjk9707bj93z_yykb0t40000gn/T/RackMultipart20160403-6431-1hpthwr.JPG>,  @original_filename="IMG_4574.JPG",  @content_type="image/jpeg",  @headers="Content-Disposition: form-data; name=\"user[user[avatar]]\"; filename=\"IMG_4574.JPG\"\r\nContent-Type: image/jpeg\r\n">},  "languages_users_attributes"=>{"language_id"=>"18",  "level"=>"1"},  "password"=>"[FILTERED]",  "password_confirmation"=>"[FILTERED]"},  "commit"=>"Sign up"} 

UPDATE** This is currently where my code is. It saves the user, but not the languages_user model

user.rb after_create :create_languages_user

def create_languages_user  @users = self.id  @languages_user = LanguagesUser.new(@user) end 

registrations controller:

def new  @user = User.new  build_resource({})  respond_with self.resource end  def create   super end  private  def configure_permitted_parameters     devise_parameter_sanitizer.for(:sign_up) { |u|       u.permit(:email, :password, :password_confirmation, :bio, :location, :last_name, :first_name, :nationality, :avatar, languages_users_attributes: [ :language_id, :level]) } end 

3 Answers

Answers 1

It is simple. Just pass block to #create method in Users::RegistrationsController controller

def create  super do |user|    language_user_params = params[:user][:langauges_user].permit(:language_id,:level)    user.languages_users.create(language_id: language_user_params[:language_id], level: language_user_params[:level])  end  end 

Answers 2

you can access the user_id in an after_create callback:

after_create :example_method  def example_method    NameOfModel.create(user_id: self.id, etc) end 

Answers 3

You can do like this

after_create :create_languages_user  def create_languages_user  @languages_user = self.languages_users.create end 
If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment