Hanky
Hanky

Reputation: 1

Strong paramters and nested attributes/forms giving me grief

So I am having some problems with strong parameters and nested forms (suprise! Nobody's ever had that problem before lol) and I've been looking at several threads, trying different solutions but still can't get a nested attribute to work so I turn to you, fellow programmers. Firstly lets look at the code, shall we? If you find anything fishy, let me know!

Aventure.rb

class Adventure < ActiveRecord::Base
belongs_to :user
has_many :photos
has_many :reservations
has_many :activity_dates
accepts_nested_attributes_for :activity_dates
...
end

Activity_date.rb

class ActivityDate < ActiveRecord::Base
belongs_to :adventure
has_many   :time_slots
accepts_nested_attributes_for :time_slots
end

Timeslot.rb

class TimeSlot < ActiveRecord::Base
belongs_to :activity_date
end

_form.hmtl.erb

 <%= form_for @adventure, html: {multipart: true} do |f| %>
 ...
 <%= f.fields_for :activity_dates, @adventure.activity_dates.new do |a| %>
    <%= a.date_field :date %>
    <%= a.hidden_field :adventure_id, value: @adventure.id %>                  
 <% end %>

adventure_controller.erb

  def adventure_params
   params.require(:adventure).permit(:activity_name,:description,:leader,
                                    :company_name,:adress,:max_perticipants,
                                    :price,:currency,{:activity_dates=>[:dates]})
  end

Right, so when I inspect the params like below I get these hashes (see img link):

     render json: { p: params.inspect, ad:adventure_params.inspect }

I have concluded that activity_dates shows up in params, but NOT in ad:adventure_params. Using params[:activity_dates] gives a ForbiddenAttributesError, which was expected. That's not a good way of going about it, as it is not permitted in the strong params. I would however like to get :activity_dates with it's attribute date, and later on even it's nested attribute for :timeslots. But no matter how many solutions I have looked at, I have not been getting the desired results. What am I doing wrong? Help me Obi-Wan, you are my only hope!

Upvotes: 0

Views: 35

Answers (1)

Dawcars
Dawcars

Reputation: 368

For nested attributes you need to add '_attributes' to the end of field name when you are adding them to your strong parameters, so you need to permit activity_dates as activity_dates_attributes as follows:

params.require(:adventure).permit(:activity_dates_attributes=>[:dates])

or as follows with your other permitted parameters:

params.require(:adventure).permit(:activity_name,:description,:leader,
                                    :company_name,:adress,:max_perticipants,
                                    :price,:currency, :activity_dates_attributes=>[:dates])

For more information on whitelisting strong parameters here are some useful links here: http://edgeapi.rubyonrails.org/classes/ActionController/StrongParameters.html https://github.com/rails/strong_parameters/

Upvotes: 1

Related Questions