我是铁杆新手,并花了太多时间在这上面。非常感谢,提前,任何帮助!
我似乎无法使用fields_for和/或accepts_nested_attributes_for来处理我的嵌套属性。
我有一个has_many
契约的smash_client和一个试图用参数创建一个smash_client的表单,同时它也试图在契约对象上设置一个参数。合同belongs_to
smash_client。
我尝试了很多不同的解决方案并阅读了文档,但我仍然遗漏了一些东西。我在我的params hash中,在smash_clients_controller.rb
..., "smash_client"=>{"name"=>"fasdf", "user"=>"adam"}, "smash_client_id"=>{"instance_type"=>"spot"},...
这
= form_for @smash_client do |f|
.field
= f.label :name
= f.text_field :name
.field
= fields_for :smash_client_id do |c|
%p
= c.radio_button :instance_type, 'spot'
= c.label :instance_type, 'spot'
= c.radio_button :instance_type, 'on_demand'
= c.label :instance_type, 'on demand'
.actions
= f.submit 'Save'
和
class SmashClient < ActiveRecord::Base
has_many :contracts, dependent: :destroy
accepts_nested_attributes_for :contracts, allow_destroy: true,
reject_if: proc { |attributes| attributes[:instance_type].blank? }
...
def new
@smash_client = SmashClient.new
3.times { @smash_client.contracts.build }
end
...
def smash_client_params
@smash_client_params = params.require(:smash_client).
permit( :user, :name, contracts_attributes: [:instance_type] )
end
end
和
class Contract < ActiveRecord::Base
belongs_to :smash_client
after_create :determine_instance_type_and_start
before_destroy :stop_instances
...
end
我认为如果我对它进行硬编码,嵌套的params会起作用,因为如果我尝试这样的东西,在控制台中,我不会出错,我会得到一个新的SmashClient和契约。
smash_client_params = {name: 'something', user: 'blah', contracts_attributes: [{instance_type: 'spot'}]}
SmashClient.create( smash_client_params )
我尝试使用:contract,@ smash_client.contracts以及fields_for
部分中的其他一些内容。也尝试使用select和collection_select,但我似乎无法确定形式。
抱歉这篇长篇文章。希望我能在问题中得到所有有用的信息。
我非常欣赏一些方向或答案。
提前谢谢。
答案 0 :(得分:1)
我终于找到了它。必须在:instance_type
模型中将Contract
列入白名单。再次感谢,kalyani。我很感激帮助。以下是对上述代码的更改:
.field
= fields_for :contracts do |c|
= c.label :instance_type, 'spot instance'
= c.radio_button :instance_type, 'spot', checked: true
= c.label :instance_type, 'on demand instance'
= c.radio_button :instance_type, 'on_demand'
和
def contract_params
params.require(:contract).
permit(:id, :name, :instance_id, :smash_client_id, :instance_type)
end
答案 1 :(得分:0)
而不是:fields_for:smash_client_id do | c |
将其写成:fields_for:contract do | c |
参见: 1. http://apidock.com/rails/ActionView/Helpers/FormHelper/fields_for
Rails 4 Nested Attributes Unpermitted Parameters ----请参阅此代码,以便在控制器中编写代码并查看正确的方法