这里是Ruby的新手,它试图建立经典的User-Articles MVC结构,但改用Objectives和Key Results。
问题:
NoMethodError in Home#index - undefined method `keyresults' for nil:NilClass
问题:
如何在控制器中定义目标和关键结果之间的关系?
我认为这就是问题所在。
关于如何进行的任何解释都将是惊人的!
我尝试过:
@objectives = Objective.all.include(:keyresult)
但这没用。
目标:在索引页面上列出所有目标及其相关的关键结果:
目标1
- 关键结果1
- 主要结果3
目标2
- 关键结果2
- 主要结果4
- 关键结果5
objective.rb
class Objective < ApplicationRecord
has_many :objectives_keyresults, dependent: :destroy
has_many :keyresults, through: :objectives_keyresults
keyresult.rb
class Keyresult < ApplicationRecord
belongs_to :objective
home_controller.rb
class HomeController < ApplicationController
def index
@objectives = Objective.all
end
index.html.erb
<%- model_class = Objective -%>
<% @objectives.each do |objective| %>
Objective:
<%= objective.title %>
Key Result:
<% @objective.keyresults.each do |keyresult| %>
<%= keyresult.title %>
<% end %>
<% end %>
schema.rb
create_table "keyresults", force: :cascade do |t|
t.string "title"
t.integer "objective_id"
t.index ["objective_id"], name: "index_keyresults_on_objective_id"
end
create_table "objectives", force: :cascade do |t|
t.string "title"
end
create_table "objectives_keyresults", force: :cascade do |t|
t.integer "objective_id"
t.integer "keyresult_id"
t.index ["keyresult_id"], name: "index_objectives_keyresults_on_keyresult_id"
t.index ["objective_id"], name: "index_objectives_keyresults_on_objective_id"
end
感谢您的帮助!
答案 0 :(得分:5)
在您的区块each
中,您使用过@objective
。是nil
使用objective
。
<% @objectives.each do |objective| %>
Objective:
<%= objective.title %>
Key Result:
<% objective.keyresults.each do |keyresult| %>
<%= keyresult.title %>
<% end %>
<% end %>
答案 1 :(得分:0)
要扩展@mechnicov的答案:在循环内时,请使用局部变量名称objective
,而不要使用实例变量名称@objective
。 NoMethodError
会告诉您确切的问题所在。您尚未在其中调用方法的对象为nil,因为尚未定义。
这是一个实际问题的简单示例:
[:a, :b, :c].each { |item| print @item.capitalize }
# NoMethodError: undefined method `capitalize' for nil:NilClass
# the instance variable @item is an instance of NilCLass
[:a, :b, :c].each { |item| print item.capitalize }
# ABC=> [:a, :b, :c]
在rails中,您可以在控制器内部定义模型对象实例变量。在视图中遍历它们时,可以使用在循环中分配的局部变量。