鉴于所有用户和所有文章的未定义方法

时间:2019-02-23 12:21:12

标签: ruby-on-rails ruby model-view-controller

这里是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

感谢您的帮助!

2 个答案:

答案 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,而不要使用实例变量名称@objectiveNoMethodError会告诉您确切的问题所在。您尚未在其中调用方法的对象为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中,您可以在控制器内部定义模型对象实例变量。在视图中遍历它们时,可以使用在循环中分配的局部变量。