2017-10-09 1 views
0

Je construis une application où un user(seller) peut créer des articles et puis un autre user(viewer) peut voir les articles et s'il le veut.Rails 5: implémenter 'ajouter aux favoris'

ce que j'ai jusqu'ici:

create_table "items", force: :cascade do |t| 
t.string "title" 
t.text "description" 
t.string "image" 
t.datetime "created_at", null: false 
t.datetime "updated_at", null: false 
t.integer "category_id" 
t.json "attachments" 
end 

create_table "favorites", force: :cascade do |t| 
t.bigint "viewer_id" 
t.string "favorited_type" 
t.bigint "favorited_id" 
t.datetime "created_at", null: false 
t.datetime "updated_at", null: false 
t.index ["favorited_type", "favorited_id"], name: "index_favorites_on_favorited_type_and_favorited_id" 
t.index ["viewer_id"], name: "index_favorites_on_viewer_id" 
end 

viewer.rb

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 

favorite.rb

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

favorite_items_controller.rb

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 
end 

J'ai ajouté ceci à views/items/show.html.erb afin d'ajouter ou supprimer le favori.

<%- unless current_viewer.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 -%> 

et jusqu'à ici tout fonctionne bien, quand je clique sur le add to favorites ... les changements de lien vers remove from favorites ... et quand je clique sur le lien remove from favorites modifications à add to favorites.

Alors maintenant, je voudrais mettre en œuvre ce qui suit, mais je ne sais pas comment: Je veux faire la boucle à travers les favoris et montrer tous les éléments favoris sur un index.html.erb avec chaque détail des éléments (titre, prix).

Répondre

0

J'espère que c'est logique simple que vous voulez filtrer FavouriteItems des articles si vous avez besoin d'une table pour stocker FavouriteItems où vous avez besoin ITEM_ID, viewer_id (utilisateur qui sélectionne l'élément stocker dans ses favourite_items) c'est tout.

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


# has_many :favorites # I don't know why it is all here 
# has_many :favorite_items, through: :favorites, source: :favorited, source_type: 'Item' 
    has_many :favorite_items 
    end 

Ensuite, vous devez faire ceci à votre classe FavouriteItem

class FavoriteItem < ApplicationRecord 
belongs_to :viewer 
end 

espérons qu'il vous donnera l'idée de base de ce que vous voulez.