【问题标题】:Newbie stuck with fields_for and nested attributes in rails新手卡在rails中的fields_for和嵌套属性
【发布时间】:2014-01-23 18:25:28
【问题描述】:

Rails 新手在这里。我被困在 Rails 中的 fields_for 上,我将永远感谢任何人的帮助。

  • 在 Events#new 中,为什么会出现 NoMethodError? 错误消息说未定义的方法“名称”
  • 在事件中,为什么会出现 NameError? 错误消息显示未定义的局部变量或方法“事件”。

我正在尝试创建和查看一个表单,其中每个事件都有每个朋友的 2 个字段。

_form.html.erb:

<%= form_for(@event) do |f| %>
 <div class="field">
Date: <%= f.text_field :date %></br>
Friends: <%= f.fields_for :friends do |friends_fields| %>
  <%= friends_fields.text_field :name %>
  <% end %>
<% end %>

index.html.erb:

<tbody>
<% @events.each do |event_form| %>
  <tr>
    <td><%= event_form.date %></td>
    <td><%= event_form.friends.each do |friend| %>
      <%= friend.name %>
      <% end %>
    </td>
    <td><%= link_to 'Show', event %></td>
    <td><%= link_to 'Edit', edit_event_path(event) %></td>
    <td><%= link_to 'Destroy', event, method: :delete, data: { confirm: 'Are you sure?' } %></td>
  </tr>
<% end %>

event.rb:

class Event < ActiveRecord::Base
    has_many :friends
    accepts_nested_attributes_for :friends, allow_destroy: true
end

朋友.rb:

class Friend < ActiveRecord::Base
    belongs_to :event
end

events_controller.rb:

def new
    @event = Event.new
    2.times { @event.friends.build }
end

【问题讨论】:

    标签: ruby-on-rails ruby form-for fields-for


    【解决方案1】:

    事件未定义,因为事件迭代器在每次迭代中使用 event_form 而不是事件变量名称。试试改成这样:

    <tbody>
    <% @events.each do |event| %>
      <tr>
        <td><%= event.date %></td>
        <td><%= event.friends.each do |friend| %>
          <%= friend.name %>
          <% end %>
        </td>
        <td><%= link_to 'Show', event %></td>
        <td><%= link_to 'Edit', edit_event_path(event) %></td>
        <td><%= link_to 'Destroy', event, method: :delete, data: { confirm: 'Are you sure?' } %></td>
      </tr>
    <% end %>
    

    【讨论】:

    • 解决了 index.html.erb 中的问题,但 Events#new 仍然返回“NoMethodError”,未定义的方法“名称”。如果我将 _form.html.erb 中的 :name 更改为 :event 以修复错误,那么当我创建新表单时,数据库朋友圈中不会显示任何内容...抱歉,如果我不清楚:(
    • 朋友桌有姓名栏吗?你能发布整个异常跟踪吗?
    • 我没有姓名栏。我尝试用 'event' 替换 'name',这解决了问题,但我仍然无法在 #<0x007faec170ef28>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多