我之前问question关于调用相关模型属性的问题。
具体来说,我询问是否尝试显示与事件关联的Vip模型实例的名称。
最初我有
<% @organization.events.each do |event| %>
<p>
<table>
<tr>
<td>
<%= event.name %>
</td>
<td>
<%= event.vips.name %>
</td>
</tr>
</table>
</p>
<% end %>
我改为
<%= event.vips.first.name %>
它工作了一会儿。我最终将其调整为
<% event.vips.each do |vip| %>
<%= vip.name %>
也工作了一会儿。但是当我休息一下后回到计算机后,新的事件表单提交不再在组织显示页面上显示vip的名称,即使数据库正在使用vip_id外键进行更新。
事实上,当我尝试
时<%= event.vips.first.name %>
再一次,我得到一个错误说&#34;未定义的方法`name&#39;为零:NilClass&#34;
我真的不确定发生了什么变化,或者我做错了什么。所以任何帮助都会受到赞赏。
更新:
为了帮助澄清问题,我从控制台获得以下输出:
irb(main):005:0> Event.first
Event Load (0.2ms) SELECT "events".* FROM "events" ORDER BY "events"."id" ASC LIMIT 1
=> #<Event id: 1, when: "2015-08-25 00:00:00", organization_id: 1, created_at: "2015-08-25 04:47:43", updated_at: "2015-08-25 04:47:43", name: "John's Event", vip_id: 1>
irb(main):006:0> Vip.first
Vip Load (0.2ms) SELECT "vips".* FROM "vips" ORDER BY "vips"."id" ASC LIMIT 1
=> #<Vip id: 1, name: "John", created_at: "2015-08-25 04:46:23", updated_at: "2015-08-25 04:46:23", organization_id: 1, event_id: nil>
irb(main):007:0> @organization
=> #<Organization id: 1, name: "Test Org", created_at: "2015-08-25 04:46:03", updated_at: "2015-08-25 04:46:03", user_id: 1>
irb(main):008:0> @organization.events.first
=> #<Event id: 1, when: "2015-08-25 00:00:00", organization_id: 1, created_at: "2015-08-25 04:47:43", updated_at: "2015-08-25 04:47:43", name: "John's Event", vip_id: 1>
irb(main):009:0> @organization.events.first.vips
Vip Load (0.2ms) SELECT "vips".* FROM "vips" WHERE "vips"."event_id" = ? [["event_id", 1]]
=> #<ActiveRecord::Associations::CollectionProxy []>
irb(main):010:0>
答案 0 :(得分:-1)
如果更新vip的event_id
,您的代码将有效Vip.first.update_attribute event_id, Event.first.id
问题发生是因为我们在Event.first和Vip.first之间没有关联
不过,我认为我们不应该使用event.vips.first.name,因为vips可以为空 我们可以稍微改变它,例如:event.vips.first.try(:name)
或
event.vips.map(&:name).join(", ")