我有一个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"}
它不起作用,因为它没有将大小转换为适当的类。
我该怎么办?
答案 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}},则会指出第一个参数是密钥(在您的情况下是披萨),下一个参数是选择框中的属性名称(壳/浇头)