以下のシステムを使用すると、ユーザーは次の形式でスタイルをお気に入りにすることができます。
=> #<Favorite id: 59, user_id: 2, favoritable_id: 15, favoritable_type: "Style", created_at: "2013-04-06 08:47:08", updated_at: "2013-04-06 08:47:08">
ユーザーがユーザーをお気に入りに登録できるようにシステムを構築しましたが、何らかの理由で、上記のStyleで呼び出されたときにUserFavorite.create!(:user => user)
で呼び出されたときに、行が期待されるお気に入りのモデル オブジェクトを作成していません。代わりに、以下のように nil を取得しています。
=> #<Favorite id: 65, user_id: 2, favoritable_id: nil, favoritable_type: nil, created_at: "2013-04-06 09:35:07", updated_at: "2013-04-06 09:35:07">
問題は以上です。詳細は以下
好きなクラス:
class Favorite < ActiveRecord::Base
belongs_to :favoritable, :polymorphic => true
belongs_to :user
attr_accessible :user
validates_presence_of :user
validates_uniqueness_of :user_id, :scope => [:favoritable_type, :favoritable_id]
end
お気に入りのモジュールを含むモデル定義 (以下を参照):
class User < ActiveRecord::Base
include Favoritable
class Style < ActiveRecord::Base
include Favoritable
有利なモジュール:
module Favoritable
extend ActiveSupport::Concern
included do
attr_accessible :favorites
has_many :favorites, :as => :favoritable, :autosave => true
accepts_nested_attributes_for :favorites
def add_favorite(user)
self.favorites << Favorite.create!(:user => user)
save
end
def delete_favorite(user)
self.favorites.where(:user_id => user.id).each do |favorite|
favorite.destroy
end
end
end
end
お気に入りコントローラー:
class FavoritesController < ApplicationController
def fav_user
@user = User.find(params[:id])
@user.add_favorite(current_user)
respond_to do |format|
format.js { render :action => "update_favorite_disp", :layout => false }
end
end
def delete_fav_user
@user = User.find(params[:id])
respond_to do |format|
if @user.delete_favorite(current_user)
format.js { render :action => "update_favorite_disp", :layout => false }
end
end
end
def fav_style
@style = Style.find(params[:id])
@style.add_favorite(current_user)
respond_to do |format|
format.js { render :action => "update_favorite", :layout => false }
end
end
def delete_fav_style
@style = Style.find(params[:id])
respond_to do |format|
if @style.delete_favorite(current_user)
format.js { render :action => "update_favorite", :layout => false }
end
end
end
end