2017-10-10 3 views
1

ich einen Fehler erhalte, wenn @favorites = current_viewer.favorites_items.where(item_id: @item.id) von meinem ItemsController Zugriff:Rails: NoMethodError in ItemsController # zeigen

NoMethodError in ItemsController#show 
undefined method `favorites_items' for nil:NilClass 

items_controller.rb

def show 
    @favorites = current_viewer.favorites_items.where(item_id: @item.id) 
    @comments = Comment.where(item_id: @item).order("created_at DESC") 
    @items = Item.find(params[:id]) 
end 

Modell Verbände:

class Viewer < ApplicationRecord 
    devise :database_authenticatable, :registerable, 
    :recoverable, :rememberable, :trackable, :validatable 

    has_many :comments, dependent: :destroy 
    has_many :favorites 
has_many :favorite_items, through: :favorites, source: :favorited, source_type: 'Item' 

end 

class Favorite < ApplicationRecord 
    belongs_to :viewer 
    belongs_to :favorited, polymorphic: true 
end 

class Item < ApplicationRecord 
    belongs_to :seller 
    belongs_to :category 
    has_many :comments, dependent: :destroy 

    mount_uploaders :attachments, ImageUploader 
end 

Routen .rb

devise_for :viewers, controllers: {registrations: 'viewers/registrations', sessions: 'viewers/sessions'} 
    devise_scope :viewer do 
    get "viewers/index"=> "viewers/sessions#index", :as => "viewer_index" 
    end 

get '/favorites', to: 'favorite_items#index', as: 'favorites' 
resources :favorite_items, only: [:create, :destroy] 

Update 1

ich als nächstes dreimal mit byebug getippt:

40: 
41: # GET /items/1 
42: # GET /items/1.json 
43: def show 
44:  byebug 
=> 45:  @favorites = current_viewer.favorites_items.where(item_id: @item.id) 
46:  @comments = Comment.where(item_id: @item).order("created_at DESC") 
(byebug) 

in /.rvm/gems/ruby-2.4.0/gems/actionpack-5.1.4/lib/action_controller/metal/rescue.rb 
17: 
18:  private 
19:  def process_action(*args) 
20:   super 
21:  rescue Exception => exception 
=> 22:   request.env["action_dispatch.show_detailed_exceptions"] ||= show_detailed_exceptions? 
23:   rescue_with_handler(exception) || raise 
24:  end 
25: end 
26: end 
(byebug) 

18:  private 
19:  def process_action(*args) 
20:   super 
21:  rescue Exception => exception 
22:   request.env["action_dispatch.show_detailed_exceptions"] ||= show_detailed_exceptions? 
=> 23:   rescue_with_handler(exception) || raise 
24:  end 
25: end 
26: end 
(byebug) 
+0

Sie haben 'current_viewer' nicht definiert. – coreyward

+0

Da Sie Devise verwenden, sollten Sie verwenden current_viewer –

+0

@Gabriel Mesquita ... es ist nur ein Tippfehler auf die Frage, ich habe es jetzt geändert – Theopap

Antwort

3

zur Authentifizierung Da Sie verschiedene Arten von Benutzern haben Rollen, müssen Sie folgendermaßen auf Ihren Helfer richtig zugreifen:

def show 
    if current_viewer 
    @favorites = current_viewer.favorites_items.where(item_id: @item.id) 
    elsif 
    @favorites = current_seller.favorites_items.where(item_id: @item.id) 
    end 
    @comments = Comment.where(item_id: @item).order("created_at DESC") 
    @items = Item.find(params[:id]) 
end 

der current_viewer-Helfer war nil, weil Sie als Verkäufer angemeldet waren!

+1

Ich musste das '' 'auf dem' if current_viewer 'loswerden, ein Fehler erschien, was darauf hindeutet ... und jetzt gibt es einen Fehler auf 'elsif' Zeile:' undefined Methode' favorites_items 'für # ' – Theopap

+0

@Theopap Zuschauer hat dies has_many: favorite_items, durch:: Favoriten, source:: favorisiert, source_type: 'Item', hat der Verkäufer auch? –

+0

Ich musste auch 'favorites_items' in' favorite_items' ändern und ich bekomme das: undefined Methode 'favorite_items 'für nil: NilClass ... hmmmm komisch – Theopap

0

Sie können vor dem Filter gesetzt haben Zuschauer

class ItemsController < ActionController::Base 
    before_action :authenticate_viewer! 

    def show 
    ... 
    end 
end 
Verwandte Themen