基本的に、最近の 10 個のマイクロポストを一覧表示するページがあります。各投稿にはいいねボタンがあります。このいいねボタンをクリックすると、データベースのいいねテーブルが更新されます。
好きなテーブル:
+----+------------+--------------+-------------------------+-------------------------+---------+
| id | likable_id | likable_type | created_at | updated_at | user_id |
+----+------------+--------------+-------------------------+-------------------------+---------+
| 2 | 5770 | Micropost | 2012-06-09 11:30:55 UTC | 2012-06-09 11:30:55 UTC | 2 |
| 3 | 5770 | Micropost | 2012-06-09 11:42:45 UTC | 2012-06-09 11:42:45 UTC | 2 |
+----+------------+--------------+-------------------------+-------------------------+---------+
ユーザーは、マイクロポストを 1 回だけ高く評価できます。jquery/js を使ってこれを可能にするには、マイクロポストがいいね! されたときに破棄パスを指す [似ていない] ボタンを表示します。
しかし、このサーバー側も行う方法はありますか? 必要に応じて、マイクロ投稿が複数回いいねされることを許可しないようにするにはどうすればよいですか? したがって、Rails コンソールに移動して、既に気に入ったマイクロポストを手動でいいね! しようとしても、マイクロポストが既に気に入ったと見なされるため、機能しませんか?
モデルのように:
class Like < ActiveRecord::Base
belongs_to :likable, :polymorphic => true
attr_accessible :likable_id, :likable_type, :user_id
end
マイクロポスト モデル:
class Micropost < ActiveRecord::Base
belongs_to :user
has_many :likes, :as => :likable
end
好きなコントローラー:
class LikesController < ApplicationController
def create
micropost = Micropost.find(params[:micropost])
like = micropost.likes.build(:user_id => current_user.id)
like.save
end
end
いいねフォーム:
<%= form_tag likes_path, :remote => true, :class => "like_micropost" do %>
<%= hidden_field_tag :micropost, micropost.id %>
<%= submit_tag '', :class => "likeMicropostSubmit" %>
<% end %>
私は以前に運がなかったこれを試しました:
class LikesController < ApplicationController
def create
micropost = Micropost.find(params[:micropost])
if micropost.likes.where(:user_id => current_user.id).nil?
like = micropost.likes.build(:user_id => current_user.id)
like.save
end
end
end
敬具