2017-05-21 13 views
1

私は、2つのモデルの間ですべてのリレーションシップにアクセスしようとしています:セリエは複数のカテゴリを持ち、複数のカテゴリは異なるシリーズになることができます。多対多の関係です。ruby​​ on railsの関係が動作しない

私は次の操作を実行しよう:

class SeriesController < ApplicationController 

    def category 
     @category = params[:category] 
     @series = [] 

     Serie.all.each do |serie| 
     @serie.categories.all.each do |cat| 
      if @cat.category == @category 
       @series << @serie 
      end 
     end 
     end 
    end 

end 

Railsは私にその例外がスローされます。ここでは

undefined method `categories' for nil:NilClass 

は、モデルは以下のとおりです。

class Serie < ApplicationRecord 
    has_many :types 
    has_many :categories, through: :types 
end 

class Type < ApplicationRecord 
    belongs_to :serie 
    belongs_to :category 
end 

class Category < ApplicationRecord 
    has_many :types 
    has_many :series, through: :types 
end 

class CreateCategories < ActiveRecord::Migration[5.1] 
    def change 
    create_table :categories do |t| 
     t.string :category 
     t.timestamps 
    end 
    end 
end 

class CreateTypes < ActiveRecord::Migration[5.1] 
    def change 
    create_table :types do |t| 
     t.references :serie, index: true 
     t.references :category, index: true 
     t.timestamps 
    end 
    end 
end 

なぜこの私にはわかりません動作しません。

ありがとう。

Serie.all.each do |serie| 
    serie.categories.all.each do |cat| 
    if cat.category == @category 
     @series << serie 
    end 
    # ... 

答えて

3

変更

Serie.all.each do |serie| 
    @serie.categories.all.each do |cat| 
    if @cat.category == @category 
     @series << @serie 
    end 
    # ... 

あなたは、変数を混同しているが、ローカル変数serieとブロックで定義されたcat、ないインスタンス変数@serieまたは@cat

1

ので、あなたの作成メソッドで。 @serieは[]と等しく設定されていますので、空の場合はそこに作成する変数はserieです。

.... 
     Serie.all.each do |serie| 
     serie.categories.all.each do |cat| 
     if cat.category == @category 
      @series << serie 
     end 
    end 
    end 
関連する問題