2017-05-21 6 views
1

Ich versuche, alle Beziehungen zwischen zwei Modellen zugreifen: Serie hat mehrere Kategorien und mehrere Kategorien können in verschiedenen Serien sein. Ist eine viele zu viele Beziehung.Rubin auf Schienen Beziehung funktioniert nicht

Ich versuche folgendes zu tun:

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 wirft mir diese Ausnahme:

undefined method `categories' for nil:NilClass 

Hier sind die Modelle:

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 

Ich weiß nicht, warum das funktioniert nicht.

Irgendeine Idee? Vielen Dank.

Antwort

3

ändern

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

zu

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

weil es einer lokalen Variablen serie und cat in den Blöcken definiert, aber keine Instanzvariablen @serie oder @cat

1

Sie mischen Sie Ihre Variablen in Ihrer Erstellungsmethode. Sie verweisen auf @serie, die auf [] gesetzt ist, so dass die Variable, die Sie dort erstellen, serie ist, also verwenden Sie das.

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