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

时间:2015-06-06 02:42:23

标签: ruby-on-rails ruby sqlite erb

我的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.maker.name 工作并打印关联Maker的名称,那么为什么 event.category.kind 不会出现相同的逻辑/语法和 event.location.area

相反,我收到了:

  

事件#index

中的NoMethodError      

显示/Users/-/app/views/events/index.html.erb 第21行

     

#Event的未定义方法`category':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

基本上我想从关联表中输出数据,而不是fore_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 %>

2 个答案:

答案 0 :(得分:0)

看看你的模特。 maker.rb可能包含has_one :event行,而event.rb可能包含belongs_to :maker,但category.rbevent.rb没有此类互惠关系。

编辑event.rb以包含:

belongs_to :category

编辑category.rb以包含:

has_one :event

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

答案 1 :(得分:0)

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 %>