Неопределенный метод с учетом всех пользователей и всех статей - PullRequest
0 голосов
/ 23 февраля 2019

Очень плохо знаком с Ruby и пытается настроить классическую структуру MVC User-Articles, но вместо этого использует Цели и Ключевые результаты.

Проблема:

NoMethodError in Home#index - undefined method `keyresults' for nil:NilClass

Вопрос:

Как определить отношение между целями и ключевыми результатами в контроллере?

Я полагаю, что здесь проблема.

Любойобъяснение того, как действовать, было бы удивительным!

Я пытался:

@objectives = Objective.all.include(:keyresult)

Но это не сработало.

Цель: наНа главной странице перечисляются все цели и связанные с ними ключевые результаты:

Цель 1

  • Ключевые результаты 1
  • Ключевые результаты 3

Цель 2

  • Результат ключа 2
  • Результат ключа 4
  • Результат ключа 5

цель.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 голосов
/ 23 февраля 2019

Чтобы расширить ответ @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 вы определяете объект вашей моделипеременные экземпляра внутри контроллера.При переборе их в представлении вы используете локальную переменную, назначенную в вашем цикле.

0 голосов
/ 23 февраля 2019

В вашем блоке each вы использовали @objective.Это nil

Использование objective.

<% @objectives.each do |objective| %>
  Objective:
  <%= objective.title %>
  Key Result:
  <% objective.keyresults.each do |keyresult| %>
    <%= keyresult.title %>
  <% end %>
<% end %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...