强烈的参数和嵌套的属性/形式让我感到悲伤

时间:2016-05-21 15:38:42

标签: ruby-on-rails parameters nested-forms strong-parameters

所以我遇到了一些强大的参数和嵌套形式的问题(太惊讶了!在大声笑之前没有人遇到过这个问题)而且我一直在寻找几个线程,尝试不同的解决方案但仍然可以&#39 ; t得到一个嵌套属性,所以我转向你,其他程序员。首先让我们看一下代码,好吗?如果你发现任何可疑的东西,请告诉我!

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

是的,所以当我检查下面的参数时,我得到了这些 hashes(参见img链接):

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

我得出结论,activity_dates显示在params中,但不在ad:adventure_params中。使用params [:activity_dates]会产生ForbiddenAttributesError,这是预期的。这不是一个很好的方法,因为在强大的参数中是不允许的。但是我想得到:activity_dates包含它的属性日期,以及后来甚至它的嵌套属性:timeslots。但无论我看到多少解决方案,我都没有得到预期的结果。我究竟做错了什么?帮助我欧比旺,你是我唯一的希望!

1 个答案:

答案 0 :(得分:1)

对于嵌套属性,当您将其添加到强参数时,需要将“_attributes”添加到字段名称的末尾,因此您需要允许activity_datesactivity_dates_attributes,如下所示:

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

或其他允许的参数如下:

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

有关白名单强参数的详细信息,请点击此处的一些有用链接:http://edgeapi.rubyonrails.org/classes/ActionController/StrongParameters.html https://github.com/rails/strong_parameters/