2017-10-10 1 views
1

Je reçois une erreur lors de l'accès @favorites = current_viewer.favorites_items.where(item_id: @item.id) de mon ItemsController:Rails: NoMethodError dans # ItemsController montrent

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 

associations Modèle:

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 

routes .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

Je tapé trois fois avec byebug:

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

Vous n'avez pas défini 'current_viewer'. – coreyward

+0

Depuis que vous utilisez concevoir, vous devez utiliser current_viewer –

+0

@Gabriel Mesquita ... c'est juste une faute de frappe sur la question, je l'ai changé maintenant – Theopap

Répondre

3

Puisque vous avez différents types d'utilisateurs rôles, vous devez accéder à votre assistant correctement comme ceci:

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 

l'assistant current_viewer était nul, parce que vous étiez connecté en tant que vendeur!

+1

Je devais me débarrasser du '?' Sur le 'if current_viewer' une erreur est apparue suggérant ceci ... et maintenant il y a une erreur sur la ligne' elsif': 'undefined method 'favorites_items' pour # ' – Theopap

+0

@ Theopap spectateur has has_many: favorite_items, à travers:: favoris, source:: favorited, source_type: 'Item', le vendeur a-t-il aussi? –

+0

J'ai aussi dû changer 'preferences_items' en' favorite_items' et je reçois ceci: méthode non définie 'items_disques 'pour nil: NilClass ... hmmmm bizarre – Theopap

0

Vous devrez régler avant filtre pour authentifier spectateur

class ItemsController < ActionController::Base 
    before_action :authenticate_viewer! 

    def show 
    ... 
    end 
end