尝试打印关联 table 的数据时出现 NoMethodError

NoMethodError when trying to print an associated table's data

我的 index.html.erb 文件有问题。

顺便说一句,@events = Event.all

15 <% @events.each do |event| %>
16   <tr>
17     <td><%= event.name %></td>
18     <td><%= event.maker_id %></td>
19     <td><%= event.maker.name %></td>
20     <td><%= event.category_id %></td>
21     <td><%= event.category.kind%></td>       #error
22     <td><%= event.location_id %></td>
23     <td><%= event.location.area %></td>
24     <td><%= event.description %></td>
25   </tr>
26 <% end %>

我的 Event table 与我的 Maker类别,以及位置 tables.

如果 event.maker.name 工作并打印关联制造商的名称,为什么 不会发生相同的 logic/syntax event.category.kindevent.location.area?

相反,我收到:

NoMethodError in Events#index

Showing /Users/-/app/views/events/index.html.erb where line #21 raised:

undefined method `category' for # Event:0x007fb4c5b0f960

...第 21 行是 event.category.kind

我的schema.rb是:

create_table "categories", force: :cascade do |t|
  t.string   "kind"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

create_table "events", force: :cascade do |t|
  t.string   "name"
  t.string   "category_id"
  t.text     "description"
  t.string   "maker_id"
  t.datetime "created_at"
  t.datetime "updated_at"
  t.string   "location_id"
end

create_table "locations", force: :cascade do |t|
  t.string   "area"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

create_table "makers", force: :cascade do |t|
  t.string   "name"
  t.string   "password"
  t.datetime "created_at"
  t.datetime "updated_at"
  t.string   "password_digest"
end

基本上我想从关联的 table 输出数据,而不是 foreign_key id 号码本身。像这样:

1 <% @events.each do |event| %>
2   <tr>
3     <td><%= event.name %></td>
4     <td><%= event.maker.name %></td>
5     <td><%= event.category.kind %></td>     #this would be an ERROR
6     <td><%= event.location.area %></td>     #this would be an ERROR
7     <td><%= event.description %></td>
8   </tr>
9 <% end %>

看看你的模型。 maker.rb 可能有行 has_one :eventevent.rb 有类似 belongs_to :maker 的东西,但 category.rbevent.rb 没有这种互惠关系。

编辑 event.rb 以包括:

belongs_to :category

编辑 category.rb 以包括:

has_one :event

为了轻松地从一个对象引用另一个对象,您必须指定它们之间的关系(在两个方向上)。

event.rb

belongs_to :location
belongs_to :category

在视图中,您应该将其命名为

<% @events.each do |event| %>
   <tr>
     <td><%= event.name %></td>
     <td><%= event.maker_id %></td>
     <td><%= event.try(:maker).try(:name) %></td>
     <td><%= event.category_id %></td>
     <td><%= event.try(:category).try(:kind) %></td>       #error
     <td><%= event.location_id %></td>
     <td><%= event.try(:location).try(:area) %></td>
     <td><%= event.description %></td>
   </tr>
 <% end %>