Ruby on rails Rails Formtastic嵌套表单-连接模型属性的表单
我面对的Ruby on rails Rails Formtastic嵌套表单-连接模型属性的表单,ruby-on-rails,forms,nested-forms,formtastic,nested-attributes,Ruby On Rails,Forms,Nested Forms,Formtastic,Nested Attributes,我面对的Formtastic问题是,我有一个表单来创建一个新的订单。在这个表单中,我想从列表中选择多个现有的食品项目。这些应该添加到我提交的新订单中。同时,我还想在FoodOrderjoin模型中设置属性。这个模型有一个integer quantity属性,我想在表单中为其设置一个字段 我要找的基本上是一个表单,它列出了所有食物项目,并将数量的字段与它所属的食物项目放在同一行 模型 class Order < ActiveRecord::Base belongs_to :user
Formtastic
问题是,我有一个表单来创建一个新的订单
。在这个表单中,我想从列表中选择多个现有的食品
项目。这些应该添加到我提交的新订单中。同时,我还想在FoodOrder
join模型中设置属性。这个模型有一个integer 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
对象,然后只保存那些值大于0的食物
如果接受的嵌套属性,则可以在拒绝中执行此操作,但这不会删除旧的FoodOrder
,有人可能会将其从3更改为0。因此,您必须覆盖FoodOrder
的quantity=
方法
我以前从未使用过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 %>
:食物单
你点了很多菜吗
def按食物(食物)检测食物或构建食物
记录=self.detect{| food_order | food_order.food_id==food.id}
如果记录为0.0?
记录=自我构建(:food=>food)
终止
记录
终止
终止
接受:食品订单的\u嵌套\u属性\u
终止
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
class FoodOrder 如果quantity基本上我最终要做的是为每个食物创建一个FoodOrder
对象,那么只保存那些值大于0的食物
如果接受的嵌套属性,则可以在拒绝中执行此操作,但这不会删除旧的FoodOrder
,有人可能会将其从3更改为0。因此,您必须覆盖FoodOrder
的quantity=
方法
我以前从未使用过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 %>
:食物单
你点了很多菜吗
def按食物(食物)检测食物或构建食物
记录=self.detect{| food_order | food_order.food_id==food.id}
如果记录为0.0?
记录=自我构建(:food=>food)
终止
记录
终止
终止
接受:食品订单的\u嵌套\u属性\u
终止
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
class FoodOrder 如果数量多,谢谢你的回答!!表格现在看起来很好,就像我要找的一样。不幸的是,我得到了一个无法修改冻结哈希Rails运行时错误。是否可能不允许修改FoodOrder
中的数量?你知道这个错误可能是从哪里来的吗?嗯,这可能是我今天剩下的时间都在打电话的方法中的破坏,但是你可以试着用“mark_for_destruction”来代替。但是,如果这不起作用,请彻底销毁,看看会发生什么。谢谢您的快速回复。既不。标记要销毁,也不注释它。两者都会导致SQLite3::ConstraintException:constraint失败:插入到“food\u orders”
您可能需要一个带有“food\u id”的隐藏字段。这个错误通常意味着数据库没有得到它所需要的值。我为食物id
添加了一个隐藏字段,但我仍然得到了无效的相同语句。很奇怪。{“utf8”=>“✓", "真实性标识“=>”PXVWRENIO3APTOJDS5AMYUSMNM1A8NNHPSSEC4PGHHHW=“,”订单“=>”{“表id”=>“1”,“食品订单属性”=>{“0”=>{“数量”=>“1”,“评论”=>“嘿”,“食品id”=>“1”、”1“=>{“数量”、”评论“=>”、“食品id”=>“2”},“承诺”=>“创建订单”、“餐厅id”=>“1”}谢谢你的回答!!表单现在看起来很好,就像我正在寻找的一样。不幸的是,我得到了一个无法修改冻结哈希Rails运行时错误。有可能不允许修改FoodOrder
中的数量吗?知道这个错误可能来自哪里吗?嗯,这可能是我正在使用的方法中的破坏今天剩下的时间都在我的手机上,但你可以试试“马克·欧毁灭”相反。但如果这不起作用,请将销毁完全取出,然后看看会发生什么。感谢您的快速回复。无论是。为销毁标记或注释都不起作用。两者都会导致SQLite3::ConstraintException:constraint失败:插入“food\u orders”
您可能需要一个带有“food\u id”的隐藏字段。这个错误通常意味着数据库没有得到它需要的值。我为食物id
添加了一个隐藏字段,但我仍然得到相同的语句无效。非常奇怪。{“utf8”=>“✓", "真实性标识“=>”PXVWRENIO3APTOJDS5AMYUSMNM1A8NNHPSSEC4PGHHHW=“,”订单“=>”{“表id”=>“1”,“食品订单属性”=>{“0”=>{“数量”=>“1”,“评论”=>“嘿”,“食品id”=>“1”、”1“=>{“数量”、”评论“=>”、“食品id”=>“2”},“承诺”=>“创建订单”、“餐厅id”=>“1”}
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