1

タスクと優先順位の間に単純な 1 対多の関係があります。

class Task < ActiveRecord::Base
    attr_accessible :subject, :body, :priority_id, :company_id, :status_id, :user_ids
    has_and_belongs_to_many :users
    belongs_to :priority
    belongs_to :company
    belongs_to :status
end


class Priority < ActiveRecord::Base
    attr_accessible :name
    has_many :tasks
end

私の tasks/show.html.erb ビューから

<%= @task.priority.name %>

これは機能します。

ただし、私のタスク/index.html.erbでは

<% @tasks.each do |task| %>
  <tr>
    <td><%= task.subject %></td>
    <td><%= task.body %></td>
    <td><%= task.priority.name %></td>
    <td><%= link_to 'Show', task %></td>
    <td><%= link_to 'Edit', edit_task_path(task) %></td>
    <td><%= link_to 'Destroy', task, confirm: 'Are you sure?', method: :delete %></td>
  </tr>
<% end %>

task.priority.name の呼び出しが機能しません。

NoMethodError をスローします。

これは本当にばかげた初心者の間違いだと思いますが、私の人生ではそれを理解することはできません. アクティブ レコード マジックがフィルター処理されて、このような外観になると想定していたでしょう。

4

3 に答える 3

3

あなたの NoMethodError は nil:NilClass にあると思います。試す:

  <%= task.priority.name if task.priority %>
于 2012-05-22T09:25:34.353 に答える
0

データベース内の主キーを持つすべてのモデルとリンクを適切に作成しましたか? 存在しない優先度 ID (prority_id) を持つタスクにリンクしていると思います。

データを確認してください。

于 2012-05-22T09:15:38.630 に答える
0

task に優先度が存在するかどうかの検証がないことを考えると、nil で「name」を呼び出している可能性は十分にあります。クリストフが言うように、優先度の存在を検証するか(validates_presence_ofで)、印刷する前に存在することを確認してください。

于 2012-05-22T16:26:16.450 に答える