2014-10-30 44 views
0

我有一個CRUD應用程序,您可以在其中創建比薩餅。您可以使用select元素選擇基準,大小和配料。爲此,我使用了collection_selectRails屬性沒有正確分配

然而,當一個披薩創建時,這些屬性不會被分配給新的對象。

這是我的形式:

<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#創建爲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

你有點不正確的參數順序。它應該看起來像

<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 
0

我知道你是想包括在比薩鍵中的所有按鍵。這就是你需要做什麼:

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

如果你看一下documentationcollection_select,它指出第一個參數是密鑰(這是比薩餅你的情況),並下一個參數是屬性名稱選擇框(地殼/澆頭)