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