视图中未定义的方法 - 太嵌套了?

时间:2018-03-09 12:21:14

标签: ruby-on-rails

我在一个按章节显示教育目标的网站上工作。在一个章节中,目标必须以特殊矩阵显示,因此我想出了一个特殊模型(1 edu obj在disease_matrix中只有一行)。

class EducationalObjective < ApplicationRecord
  belongs_to :chapter
  belongs_to :disease_matrix
end

class DiseaseMatrix < ApplicationRecord
    has_many :educational_objectives
end

class Chapter < ApplicationRecord
    has_many :educational_objectives
end

ChaptersController
  def show
    @chapter = Chapter.find(params[:id])
    @educational_objectives = @chapter.educational_objectives
  end
end

目标按我的意愿显示,但在带有矩阵的页面上我不知道该怎么做:

<%= @chapter.title %>
<p><%= @chapter.description %></p>
<table>
  <thead>
    <tr>
      <td>Objective</td>
      <td>Matrix AA</td>
      <td>Matrix BB</td>
      ...
      <td>Matrix XX</td>
    </tr>
  </thead>
  <tbody>
    <% @educational_objectives.each do |e| %>
    <tr>
     <td><%= e.name %></td>
     <td><%= e.disease_matrix.aa %>
     <td><%= e.disease_matrix.bb %>
     ...
    </tr>
    <% end %>
</table>

schema.rb

create_table "disease_matrices", force: :cascade do |t|
    t.integer "educational_objective_id"
    t.integer "nklz_id"
    t.string "kardio"
    t.string "muscle"
    t.string "hormone"
    t.string "respi"
    t.string "blut"
    t.string "uro"
    t.string "verdauung"
    t.string "haut"
    t.string "sinne"
    t.string "nerven"
    t.string "op"
    t.string "therapeutika"
    t.string "infektion"
    t.string "notfall"
    t.string "gesundheit"
    t.string "dd"
    t.string "hygiene"
    t.string "compliance"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

错误是未定义的方法“aa”。由于我认为@educational_objectives通过模型连接到DiseaseMatrix,我只是在视图中添加了它们。但它不起作用。 我是否必须在Controller上工作并添加类似的内容 @disease_matrix = ?!?或我该怎么做?

提前致谢!是的,我是铁杆的新手。

错误讯息: 未定义的方法`dd'代表nil:NilClass

3 个答案:

答案 0 :(得分:0)

我相信你需要建立一个has_many:通过你的章节和疾病矩阵之间的关系。

所以而不是:

class DiseaseMatrix < ApplicationRecord
    has_many :educational_objectives
end

你想要

class DiseaseMatrix < ApplicationRecord
  has_many :educational_objectives
  has_many :chapters, through: :educational_objectives
end

反过来章节。

您可以阅读所有相关内容here

答案 1 :(得分:0)

感谢您的大力帮助和想法。 我的解决方案如下:

a)更多地考虑关联,我发现它是一个has_one/belongs_to关联。

b).includes的提示让我到了手册中的正确位置.join

经过一番摆弄后,我想出了这个,就像我一样:

class EducationalObjective < ApplicationRecord
  belongs_to :chapter
  has_one :disease_matrix
end

class DiseaseMatrix < ApplicationRecord
  belongs_to :educational_objective
end

class Chapter < ApplicationRecord
  #### no association to DiseaseMatrix necessary
end

ChaptersController
  def show
    @chapter = Chapter.find(params[:id])
    @educational_objectives = @chapter.educational_objectives.joins(:disease_matrix)
  end
end

<td><%= e.disease_matrix.kardio %></td>现在显示这些内容,我希望它能够呈现。

再次感谢!

答案 2 :(得分:0)

感谢您的大力帮助和想法! 这是我的解决方案:

1st)考虑这些关联让我觉得它是一个has_one/belongs_to关联

2).include的提示将我带到了文档中的正确位置.joins

在摆弄了一下之后,现在我的最终代码显示了我想要的所有内容:

class EducationalObjective < ApplicationRecord
  belongs_to :chapter
  has_one :disease_matrix
end

class DiseaseMatrix < ApplicationRecord
  belongs_to :educational_objective
end

class Chapter < ApplicationRecord
  ## no association to DiseaseMatrix needed
end

ChaptersController
  def show
    @chapter = Chapter.find(params[:id])
    @educational_objectives = @chapter.educational_objectives.joins(:disease_matrix)
  end
end

<td><%= e.disease_matrix.kardio %></td>现在显示数据库的内容。

感谢所有人的帮助和时间!