2017-10-09 2 views
0

Ich baue eine App, wo ein user(seller) kann Artikel erstellen und dann ein anderer user(viewer) kann die Elemente anzeigen und add to favorites, wenn er will.Schienen 5: implementieren 'zu Favoriten hinzufügen'

das, was ich so weit gekommen:

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 

Ich habe dies zu den views/items/show.html.erb hinzugefügt, um Favoriten hinzuzufügen oder zu entfernen.

<%- 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 -%> 

und bis hier alles funktioniert gut, wenn ich auf der add to favorites klicken ... den Link Änderungen remove from favorites ... und wenn ich auf remove from favorites Änderungen klicken Sie auf den Link zu add to favorites zurück.

Also jetzt möchte ich folgendes implementieren, aber nicht wissen, wie: Ich möchte durch die Favoriten und zeigen Sie alle Lieblingsartikel auf einem index.html.erb zusammen mit jedem Artikel Details (Titel, Preis).

Antwort

0

Ich hoffe, es ist einfache Logik, die Sie FavouriteItems aus den Artikel filtern möchten so benötigen Sie eine Tabelle FavouriteItems speichern in dem Sie benötigen ITEM_ID, VIEWER_ID (Benutzer, der das Element auswählt in seinen Favoriten zu speichern) das ist es.

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 

Dann müssen Sie diese auf Ihre FavouriteItem Klasse tun

class FavoriteItem < ApplicationRecord 
belongs_to :viewer 
end 

es Hoffnung geben Ihnen die grundlegende Idee, was Sie wollen.

Verwandte Themen