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