rails 4嵌套属性不会创建has_many模型

时间:2015-04-13 06:42:35

标签: ruby-on-rails-4 radio-button one-to-many nested-attributes fields-for

我是铁杆新手,并花了太多时间在这上面。非常感谢,提前,任何帮助!

我似乎无法使用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,但我似乎无法确定形式。 抱歉这篇长篇文章。希望我能在问题中得到所有有用的信息。 我非常欣赏一些方向或答案。 提前谢谢。

2 个答案:

答案 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

  1. http://railscasts.com/episodes/196-nested-model-form-part-1

  2. Rails 4 Nested Attributes Unpermitted Parameters ----请参阅此代码,以便在控制器中编写代码并查看正确的方法