1

以下のシステムを使用すると、ユーザーは次の形式でスタイルをお気に入りにすることができます。

=> #<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
4

1 に答える 1