我想创建一个多态模型,以便在我的用户页面中收藏我想要创建的每个对象。 我正在开发一个学习日语的网络应用程序,我们可以喜欢不同类型的卡片如kanas或kanjis和句子。 所以有3个对象,很快就会被收藏。
我迁移了一个名为Favorite的表:
create_table "favorites", force: :cascade do |t|
t.integer "user_id"
t.integer "favoritable_id"
t.string "favoritable_type"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
以下是收藏夹型号belongs_to
class Favorite < ActiveRecord::Base
belongs_to :favoritable, polymorphic: true
belongs_to :user
end
以下是卡片型号has_many
class Symbole < ActiveRecord::Base
accepts_nested_attributes_for :kanji_attribute, :allow_destroy => true
has_many :sentence_symboles, :class_name => "SentenceSymbole", :foreign_key => "symbole_id"
has_many :favorites, as: :favoritable
end
我也加入了句子模型
class Sentence < ActiveRecord::Base
include Authority::Abilities
has_many :sentence_symboles, :class_name => "SentenceSymbole", :foreign_key => "sentence_id", dependent: :destroy
has_many :favorites, as: :favoritable
end
现在这里是Favorite控制器,我真的不知道如何编写create方法。这是我做的控制器:
class FavoritesController < ApplicationController
def index
@favorites = Favorite.where(user: current_user)
end
def create
#Favorite.create(user_id: User.last.id, favoritable_id: Symbole.last.id, favoritable_type:"Symbole")
@favorite = current_user.favoritable.favorites.create(symbole: @symbole, sentence: @sentence).first
if @favorite.present?
@favorite.destroy
else
@favorite = current_user.favorites.new(symbole: @symbole, sentence: @sentence)
if not @symbole.favorites.where(user: current_user).take
@sentence.favorites.where(user: current_user).take
@favorite.save
end
end
# redirect_to favs_path
# redirect_to :back
respond_to do |format|
format.js { render :ajax_update_favs }
end
end
def destroy
@favorite = Favorite.find(params[:id])
@favorite.destroy
redirect_to :back
end
end
请有人能给我正确的方式来收藏我想要的所有对象,并添加一个最喜欢的索引#view。
感谢您的帮助。
我认为我的问题很简单,但没有。如何用def创建控制器最喜欢的每个对象是什么?
我这样做
def create
#Favorite.create(user_id: User.last.id, favoritable_id: Symbole.last.id, favoritable_type:"Symbole")
@favorite = @favoritable.favorites.build(favorite_params)
@favorite.user = current_user
@favorite.save
respond_to do |format|
format.js { render :ajax_update_favorites }
end
end
答案 0 :(得分:0)
不确定我完全理解这个问题。您似乎过度复杂favoritesController#create
。如果记录只应被优惠一次,则应在Favorite
模型中添加uniqueness validation。
假设您的user
模型设置为
class User < ActiveRecord::Base
has_many :favorites
# Rest..
end
def create
@favorite = current_user.favorites.create(favorite_params)
# This will create a new Favorite with user_id: current_user.id, favoritable_type: "Symbole", favoritable_id: 1337
# Is this the desired behaviour?
respond_to do |format|
format.js { render :ajax_update_favs }
end
end
private
def favorite_params
params.require(:favorite).permit(:favoritable_type, :favoritable_id)
end
如果从javascript调用jquery,则传递您不喜欢的类型和ID。
$.post( "/favorites", {
favorites: {
favoritable_type: "Symbole",
favoritable_id: 1337
}
});