基本的ActiveModel方法不能处理对象

时间:2015-08-25 05:30:28

标签: ruby-on-rails

我之前问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>

1 个答案:

答案 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(", ")