Rails属性未正确分配

时间:2014-10-30 12:00:04

标签: ruby-on-rails ruby-on-rails-4

我有一个CRUD应用程序,您可以在其中创建比萨饼。您可以使用select元素选择基础,大小和浇头。为此,我使用了collection_select

但是,创建披萨时,这些属性不会分配给新对象。

这是我的表格:

<div class="field">
  <%= f.label :size_id %><br>
  <%= collection_select(:size, :pizza_id, Size.all, :id, :name) %>
</div>
<div class="field">
  <%= f.label :crust_id %><br>
  <%= collection_select(:crust, :pizza_id, Crust.all, :id, :name) %>
</div>
<div class="field">
  <%= f.label :toppings %><br>
  <%= collection_select(:toppings, :pizza_id, Topping.all, :id, :name, {}, { :multiple => true }) %>
</div>

使用scaffold

生成的控制器
class PizzasController < ApplicationController
  before_action :set_pizza, only: [:show, :edit, :update, :destroy]
  ...
  def create
    @pizza = Pizza.new(pizza_params)
    ...
  end
  ...
  private
    def pizza_params
      params.require(:pizza).permit(:name, :price, :size, :crust, :topping => [])
    end
end

当我查看日志中的参数时,我可以看到:

PizzasController处理#create as HTML

  Parameters: {"utf8"=>"✓", "authenticity_token"=>"5oiP9EzpTC1fOVGSxv6MXF1qg786Vy3BtnIzEmCh19s=", "pizza"=>{"name"=>"Small pizza", "price"=>"10"}, "crust"=>{"pizza_id"=>"1"}, "toppings"=>{"pizza_id"=>["", "1", "2"]}, "commit"=>"Create Pizza"}

pizza键中未包含未保存的属性,这就是为什么它们未被分配给对象的原因。

我注意到输入name的格式应为pizza[attribute],因此它会转到正确的哈希值。所以我试过这样的事情:

<%= collection_select(:size, :pizza_id, Size.all, :id, :name) %>

这些是参数:

Processing by PizzasController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"5oiP9EzpTC1fOVGSxv6MXF1qg786Vy3BtnIzEmCh19s=", "pizza"=>{"name"=>"Small pizza", "price"=>"10", "size"=>"1"}, "crust"=>{"pizza_id"=>"1"}, "toppings"=>{"pizza_id"=>["", "1", "2"]}, "commit"=>"Create Pizza"}

它不起作用,因为它没有将大小转换为适当的类。

我该怎么办?

2 个答案:

答案 0 :(得分:0)

你对params命令有点不对劲。它应该看起来像

<div class="field">
  <%= f.label :size_id %><br>
  <%= collection_select(:pizza, :size_id, Size.all, :id, :name) %>
</div>
<div class="field">
  <%= f.label :crust_id %><br>
  <%= collection_select(:pizza, :crust_id, Crust.all, :id, :name) %>
</div>
<div class="field">
  <%= f.label :toppings %><br>
  <%= collection_select(:pizza, :topping_ids, Topping.all, :id, :name, {}, { :multiple => true }) %>
</div>

第一个参数是哈希根,然后是属性

并将params方法更改为

def pizza_params
  params.require(:pizza).permit(:name, :price, :size_id, :crust_id, :topping_ids)
end

答案 1 :(得分:0)

我知道你想要披萨钥匙中包含的所有钥匙。这是你需要做的:

<%= collection_select(:pizza, :crust_id, Crust.all, :id, :name) %>
<%= collection_select(:pizza, :topping_ids, Topping.all, :id, :name, {}, { :multiple => true }) %>

如果查看collection_select的{​​{3}},则会指出第一个参数是密钥(在您的情况下是披萨),下一个参数是选择框中的属性名称(壳/浇头)