嵌套属性不会绑定到模型

时间:2016-06-01 13:27:09

标签: ruby-on-rails

我正在尝试允许在帖子中使用我的模型提交嵌套属性。我正在使用RubyMine作为我的IDE,在调试时,我能够看到正在发布的正确值,但我无法弄清楚它们在@model中设置的是什么。

模型

class Product < ActiveRecord::Base
  has_many :product_prices
  accepts_nested_attributes_for :product_prices, allow_destroy: true
end
class ProductPrice < ActiveRecord::Base
  belongs_to :product
end

查看代码

<%= form_for :model, url: products_path do |f| %>
    <p>
        <%= f.label :name %><br/>
        <%= f.text_field :name %>
    </p>

    <table>
        <%= f.fields_for :product_prices do |ff| %>
            <tr>
                <td><%= ff.text_field :start_date %></td>
                <td><%= ff.text_field :end_date %></td>
                <td><%= ff.text_field :price %></td>
                <td><%= ff.check_box :_destroy %></td>
            </tr>
        <% end %>
    </table>

    <%= link_to 'Go Back', products_url %>
    <%= f.submit 'Create' %>
<% end %>

控制器(已更新!)

def create
    @model = Product.new(product_params)

    if @model.save
      redirect_to @model
    else
      render 'new'
    end
  end

private
def product_params
    params.require(:model).permit(:id, :name, :description, :is_active, product_prices_attributes: [:id, :product_id, :start_date, :end_date, :price, :_destroy])
end

修改 以下是我的参数结构:

{
    "utf8"=>"✓",
    "authenticity_token"=>"Hu+mTRWtTLz3wvPOPPw/OdkP1DWqneT2bR+mc2LlWe0eFX9LOYjB28005gjIcRDn3JskV4d7V+2IojIalyQc2A==",
    "model"=>{
      "name"=>"SENATE BILL OLTEST",
      "description"=>"sdfasd",
      "is_active"=>"1",
      "product_prices"=>{
        "start_date"=>"1/1/2013",
        "end_date"=>"",
        "price"=>"15.00",
        "_destroy"=>"0"
      }
    },
    "commit"=>"Create"
}

3 个答案:

答案 0 :(得分:0)

我认为问题源于在控制器更新操作中急切加载product_prices。我依旧记得在过去遇到过类似的问题,但我找不到任何相关文档。变化:

 @model = Product.includes(:product_prices).find(params[:id])

要:

  @model = Product.find(params[:id])

看看是否有效。

答案 1 :(得分:0)

你的产品参数应采用私人方式..

private
def product_params
  params.require(:model).permit(:id, :name, :description, :is_active,   product_prices_attributes: [:id, :product_id, :start_date, :end_date, :price, :_destroy])
end

product_prices和product_prices_attributes也不一样

答案 2 :(得分:0)

我的代码存在一些问题

  1. 而不是form_for :model我应该form_for @model
  2. 我的product_params应该是:

    params.require(:product).permit(:id, :name, :description, :is_active, {:product_prices_attributes => [:id, :product_id, :start_date, :end_date, :price, :_destroy]})`