【问题标题】:Rails Nested Attributes Doesn't Insert ID CorrectlyRails 嵌套属性未正确插入 ID
【发布时间】:2011-01-05 01:29:55
【问题描述】:

我正在尝试编辑模型的嵌套属性,就像大纲 here 一样,在此处复制:

    <%= form_for @person do |person_form| %>
      <%= person_form.text_field :name %>
      <% for address in @person.addresses %>
        <%= person_form.fields_for address, :index => address do |address_form|%>
          <%= address_form.text_field :city %>
        <% end %>
      <% end %>
    <% end %>

在我的代码中,我有以下内容:

<%= form_for(@meal) do |f| %>
  <!-- some other stuff that's irrelevant... -->

      <% for subitem in @meal.meal_line_items %>
         <!-- # Edit 2: I need to display information here about the subitem
              Which I can't find a way to pass it to the partial, or work in 
              this manner for existing items
         -->
         <%= subitem.food.name %>
         <%= subitem.food.calories %>

         <%= f.fields_for subitem, :index => subitem do |line_item_form| %>
            <%= line_item_form.label :servings %><br/>
            <%= line_item_form.text_field :servings %><br/>
            <%= line_item_form.label :food_id %><br/>
            <%= line_item_form.text_field :food_id %><br/>
         <% end %>
      <% end %>

      <%= f.submit %>
<% end %>

这很好用,除了当我查看 HTML 时,它正在创建如下所示的输入,未能输入正确的 id 而是放置模型的内存表示(?)。结果,更新失败:

<input type="text" value="2" size="30" name="meal[meal_line_item][#<MealLineItem:0x00000005c5d618>][servings]" id="meal_meal_line_item_#<MealLineItem:0x00000005c5d618>_servings">

编辑: 我试图在这种方法中这样做的原因是我需要收集一些有关现有meal_line_items 关联的信息。比如在我取出代码的区域,我有一些代码的效果是:

<%= subitem.food.name %>
<%= subitem.food.calories %>

如果我使用带有部分的表单生成器,至少在我的试验中没有,那么获取此信息将不起作用。

编辑 2:* 请参阅代码中的编辑。这是我的 MealLineItem

class MealLineItem < ActiveRecord::Base
  # Associations ---------------------
  belongs_to :food
  belongs_to :meal
end

并且餐会接受模型的_nested_attributes。如您所见,它属于食物和膳食模型。对于现有的 meal_line_item 我需要执行以下操作:

meal_line_item.food.name

【问题讨论】:

    标签: ruby-on-rails indexing nested-attributes


    【解决方案1】:

    &lt;%= fields_for 中是否缺少 f.

    --编辑

    你试过了吗:

    <%= f.fields_for 'meal[meal_line_item][]', subitem do |line_item_form| %>
    

    --编辑

    文档说它也应该在没有循环的情况下工作:

    <%= form_for(@meal) do |f| %>
      <!-- some other stuff that's irrelevant... -->
    
      <%= f.fields_for :meal_line_items do |line_item_form| %>
        <%= line_item_form.label :servings %><br/>
        <%= line_item_form.text_field :servings %><br/>
        <%= line_item_form.label :food_id %><br/>
        <%= line_item_form.text_field :food_id %><br/>
      <% end %>
    
      <%= f.submit %>
    <% end %>
    

    【讨论】:

    • 我错过了复制 f。从尝试不同的事情复制代码时:(
    • 不。供参考,没有 f。输入基本上没有说明它们是“膳食”的一部分,并以以下 id 结束:meal_line_item_#<0x00000005c5d618>
    【解决方案2】:

    必须对此进行测试,但也许是这种方法?

    _form

    <%= form.fields_for :meal_line_items do |meal_line_item_form| %>
     <% @meal.meal_line_items.each do |meal_line_item| %>
      <%= render :partial => "meal_line_items/meal_line_item", :locals => { :meal_line_item_form => meal_line_item_form, :meal_line_item => meal_line_item } %>
     <% end %>
    <% end %>
    

    meal_line_items/_meal_line_item.erb

    <%= meal_line_item_form.label :servings %><br/>
    <%= meal_line_item_form.text_field :servings %><br/>
    <%= meal_line_item_form.label :food_id %><br/>
    <%= meal_line_item_form.text_field :food_id %><br/>
    

    编辑

    这里是一个直接设置 formbuilder 迭代器的示例的链接(尽管是 Rails 2.3.8)。 Outbreak -> Incidents -> Location 之间的关联应该类似于 Meal -> Meal_line_items -> Food。

    AJAX update of accepts_nested_attributes_for partials

    【讨论】:

    • 如果我按照你说的做,当我尝试使用来自 meal_line_item 的信息时,我得到一个 NameError与部分相同。
    • 模型有这种关联?对格式感到抱歉... 膳食 has_many: meal_line_items accept_nested_attributes_for :meal_line_item :::::: Meal_line_item belongs_to: 膳食
    • 是的,但是meal_line_item 也属于食物。因此,当我想通过该膳食行项目上的关联查看食品项目时,我无法让该事物在部分工作。也许我错误地传递了变量,但是您发布的代码不适用于本地人,也不适用于我尝试的任何其他方法。
    • 添加了一个指向直接设置 Formbuilder 迭代器的页面的链接,尽管那里有很多填充。除非您需要通过 ajax 调用添加meal_line_items,否则可能会矫枉过正(即使那样,也必须有更好的方法来做到这一点)。
    • 通过 ajax 添加项目并没有那么多 - 可以正常工作。它正在显示已经存在的项目。您最初发布的执行 fields_for 和内部循环的代码基本上显示了两次代码,因为它是一个双 for 循环。
    【解决方案3】:

    高低搜索后,发现错误。尽管我正在修改部分并收到 NameError ,但这是因为我从辅助方法调用部分 - 与以下问题中所述的问题完全相同:

    rails fields_for render partial with multiple locals producing undefined variable

    【讨论】:

      猜你喜欢
      • 2016-08-16
      • 1970-01-01
      • 2015-02-12
      • 1970-01-01
      • 2013-06-05
      • 2015-01-15
      • 2018-02-27
      • 2019-11-07
      • 2011-02-25
      相关资源
      最近更新 更多