2017-10-09 1 views
0

Je suis en train de mettre en œuvre dans les favoris et je reçois cette erreur:Rails: Impossible de trouver l'article avec « id » =

ActiveRecord::RecordNotFound in FavoriteItemsController#index 
Couldn't find Item with 'id'= 

c'est là l'erreur apparaît, à l'adresse suivante lien:

<%= link_to "Favorite Items", favorites_path, method: :get, :class => 'navbar-link' %> 

associations modèle

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

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

has_many :favorites 
has_many :favorite_items, through: :favorites, source: :favorited, source_type: 'Item' 
end 

routes:

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

et les add ou remove liens favoris sur ma page show:

<%- unless current_shopper.favorite_items.exists?(id: @item.id) -%> 
    <%= link_to 'Add to favorites', favorite_items_path(item_id: @item), method: :post %> 
<%- else -%> 
    <%= link_to 'Remove from favorites', favorite_item_path(@item), method: :delete %> 
<%- end -%> 

le contrôleur

class FavoriteItemsController < ApplicationController 
before_action :set_item 

    def index 
    @favorites = current_viewer.favorites 
    end 

    def create 
    if Favorite.create(favorited: @item, viewer: current_viewer) 
     redirect_to @item, notice: 'Item has been favorited' 
    else 
     redirect_to @item, alert: 'Something went wrong...*sad panda*' 
    end 
    end 

    def destroy 
    Favorite.where(favorited_id: @item.id, viewer_id: current_viewer.id).first.destroy 
    redirect_to @item, notice: 'Item is no longer in favorites' 
    end 

    private 

    def set_item 
    @item = Item.find(params[:item_id] || params[:id]) 
    end 

et l'indice de boucle à travers les éléments favorisés, mais pas sûr que ce soit correct puisque l'erreur s'arrête avant la boucle:

<% @favorites.each do |item| %> 
    <tr> 
    <td><%= item.title %></td> 
    <td><%= item.price %></td> 
    <td><%= link_to 'Remove from favorites', favorite_items_path(@item.id), method: :delete %></td> 
    < /tr> 
<% end %> 

Mise à jour 1

C'est ce que je reçois quand je clique sur ajouter aux favoris

Item Exists (4.3ms) SELECT 1 AS one FROM "items" INNER JOIN "favorites" 
ON "items"."id" = "favorites"."favorited_id" WHERE "favorites"."viewer_id" 
= $1 AND "favorites"."favorited_type" = $2 AND "items"."id" = $3 LIMIT $4 
[["viewer_id", 2], ["favorited_type", "Item"], ["id", 4], ["LIMIT", 1]] 

items_controller.rb

def create 
    @item = Item.new(item_params) 

    respond_to do |format| 
     if @item.save 
     format.html { redirect_to @item, notice: 'Item was successfully created.' } 
     format.json { render :show, status: :created, location: @item } 
     else 
     format.html { render :new } 
     format.json { render json: @item.errors, status: :unprocessable_entity } 
     end 
    end 
    end 


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

Pouvez-vous confirmer que @item non nul? – krishnar

+0

ajouter ou supprimer des liens favoris sur ma page show: où est votre show show? – krishnar

+0

@krishnar ... Afficher l'action se trouve dans 'items_controller.rb' et c'est dans cela' @ items = Item.find (params [: id])' – Theopap

Répondre

1
class FavoriteItemsController < ApplicationController 
    before_action :set_item, only: [:create, :destroy] 
    .. 
    .. 
end 

Index html

<%= link_to 'Remove from favorites', favorite_items_path(@item.id), method: :delete %>

remplacer par

<%= link_to 'Remove from favorites', favorite_item_path(item.id), method: :delete %>

0

Essayez vous remplacer FavoriteItemsController avec

before_action :set_item, :only => [:create, :destroy] 
+0

Cela fonctionne, mais maintenant je reçois une erreur sur cette ligne dans 'index.html.erb'' <% = link_to 'Supprimer des favoris', favorite_items_path (@item.id), méthode:: delete%> 'l'erreur est' unidfined method id 'pour nil: NilClass' – Theopap

+0

utilise 'item.id' au lieu de' @ item.id' –