NoMethodError beim Versuch, die Daten einer verknüpften Tabelle zu drucken - ruby-on-rails, ruby, sqlite, sqlite3, erb

Ich habe Probleme mit meiner index.html.erb-Datei.

Apropos, @events = Ereignis.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 %>

Meine Veranstaltung Tabelle ist zugeordnet (hat die fremder_keys von) my Hersteller, Kategorie, und Ort Tabellen.

Ob event.maker.name arbeitet und druckt den Namen des assoziierten Makers, wie kommt es nicht zu der gleichen Logik / Syntax Ereignis.Kategorie.Kind und event.location.area?

Stattdessen erhalte ich:

NoMethodError in Ereignissen # index

/Users/-/app/views/events/index.html.erb wo Zeile # 21 angehoben:

undefinierte Methode `category 'für # Ereignis: 0x007fb4c5b0f960

... wo Zeile 21 ist Ereignis.Kategorie.Kind

Mein Schema.rb ist:

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

Grundsätzlich möchte ich Daten aus den zugehörigen Tabellen ausgeben, nicht die Fremdschlüssel-ID-Nummern selbst. So was:

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

Antworten:

0 für die Antwort № 1

event.rb

belongs_to :location
belongs_to :category

In Anbetracht sollten Sie es als nennen

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

0 für die Antwort № 2

Schau dir deine Modelle an. maker.rb Wahrscheinlich hat die Linie has_one :event, und event.rb hat sowas belongs_to :maker aber category.rb hat keine solche wechselseitige Beziehung mit event.rb.

Bearbeiten Sie event.rb, um Folgendes einzuschließen:

belongs_to :category

Bearbeiten Sie category.rb, um Folgendes einzuschließen:

has_one :event

Um ein Objekt leicht von einem anderen Objekt zu referenzieren, müssen Sie die Beziehung zwischen beiden angeben (in beide Richtungen).


Am beliebtesten