2

我與Formtastic面臨的問題屬性是,我有一個表格,以創建一個新的Order。在這種形式下,我想從列表中選擇多個現有的Food項目。這些應該被添加到我提交的新訂單中。同時我也想在FoodOrder連接模型中設置屬性。此模型具有整數數量屬性,我希望在該表單中有一個字段。Rails的Formtastic嵌套形式 - 形式從加盟模式

什麼我基本上找的是,列出了所有食品和在同一行,因爲它屬於食品項目把一個場爲quantity一種形式。

模型

class Order < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :restaurant 
    has_many :food_orders 
    has_many :foods, :through => :food_orders 
end 

class FoodOrder < ActiveRecord::Base 
    belongs_to :food 
    belongs_to :order 
end 

class Food < ActiveRecord::Base 
    has_many :food_orders 
    has_many :orders, :through => :food_orders 
    belongs_to :category 
end 

這是迄今爲止我已經試過形式的版本之一。但我只是感到困惑,不知道如何爲FoodOrder模型獲取字段。

<%= semantic_form_for [@restaurant, @order] do |f| %> 
    <%= f.inputs do %> 
    <%= f.input :comment %><br /> 
    <%= f.input :table_id %><br /> 
    <%# <%= f.input :foods, :as => :check_boxes %> 
    <%= f.inputs :for => :foods do |food| %> 
     <%= food %> 
     <%= food.inputs :quantity %> 
    <% end %> 
    <% end %> 
    <%= f.buttons do %> 
    <%= f.commit_button %> 
    <% end %> 
<% end %> 

我的模型具有這些屬性

create_table "food_orders", :force => true do |t| 
    t.integer "quantity", :null => false 
    t.decimal "price",  :null => false 
    t.integer "food_id", :null => false 
    t.integer "order_id", :null => false 
    t.text  "comment" 
    t.datetime "created_at", :null => false 
    t.datetime "updated_at", :null => false 
end 

create_table "foods", :force => true do |t| 
    t.integer "category_id",      :null => false 
    t.string "name",       :null => false 
    t.string "description" 
    t.string "image" 
    t.decimal "default_price",     :null => false 
    t.boolean "active",  :default => true, :null => false 
    t.datetime "created_at",      :null => false 
    t.datetime "updated_at",      :null => false 
end 

create_table "orders", :force => true do |t| 
    t.integer "restaurant_id",     :null => false 
    t.integer "user_id",       :null => false 
    t.integer "table_id",       :null => false 
    t.decimal "total",       :null => false 
    t.datetime "finished_at" 
    t.datetime "created_at",      :null => false 
    t.datetime "updated_at",      :null => false 
end 

回答

0

基本上我最終會做的是創造每一個Food對象FoodOrder則僅保存有大於0

值的那些你可以這樣做,在一個reject_ifaccepts_nested_attributes_for但不會刪除舊FoodOrder s表示有人可能會改變從3比0。因此,你將不得不重寫ŧ他的quantity=方法FoodOrder

我從來沒有使用formtastic之前,但我會採取一種猜測,並說,這應該工作。

<%= semantic_form_for [@restaurant, @order] do |f| %> 
    <%= f.inputs do %> 
    <%= f.input :comment %><br /> 
    <%= f.input :table_id %><br /> 
    <% @foods.each do |food| 
     <%= f.semantic_fields_for :food_orders, 
          @order.food_orders.detect_or_build_by_food(food) 
          do |food_order| %> 
     <%= food %> 
     <%= food_order.inputs :quantity %> 
     <% end %> 
    <% end %> 
    <% end %> 
    <%= f.buttons do %> 
    <%= f.commit_button %> 
    <% end %> 
<% end %> 

order.rb:

class Order < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :restaurant 
    has_many :foods, :through => :food_orders 
    has_many :food_orders do 
    def detect_or_build_by_food(food) 
     record = self.detect{ |food_order| food_order.food_id == food.id } 
     if record.nil? 
     record = self.build(:food => food) 
     end 
     record 
    end 
    end 

    accepts_nested_attributes_for :food_orders 
end 

food_order.rb:

class FoodOrder < ActiveRecord::Base 
    belongs_to :food 
    belongs_to :order 

    def quantity=(quantity) 
    if quantity <= 0 
     self.destroy 
    else 
     self[:quantity] = quantity 
    end 
    end 
end 

我希望的作品,但它是未經測試的代碼,所以是...祝你好運!

+0

謝謝您的回答!表格現在看起來不錯,就像我在找的那樣。不幸的是,我得到'不能修改凍結哈希'Rails運行時錯誤。不允許修改'FoodOrder'中的數量嗎?任何想法可能來自哪裏? – patrickdet 2012-01-08 11:32:17

+0

嗯,它可能是在我要成爲我的電話了一天休息的方法摧毀,但你可以試試「mark_for_destruction」代替。但是,如果這樣做不起作用,那就完全消滅這個破壞,看看會發生什麼。 – Azolo 2012-01-08 11:50:40

+0

感謝您的快速回復。 '.mark_for_destruction'也沒有評論它的工作。都導致'SQLite3 :: ConstraintException:約束失敗:INSERT INTO「food_orders」' – patrickdet 2012-01-08 12:05:32