📝
rails お気に入り機能の実装をしてみた
みなさん、こんばんは!
オリジナルアプリの機能追加でお気に入り機能を追加しました。
ajaxで実装したかったけど、とりあえず普通に実装したので、自分の記録用として置いておきます!
モデルの作成
お気に入り機能のモデルを作成
いいね機能にするか迷っていたので、どっちにも対応できるようにlike modelにした
rails g model like
続いてマイグレーションファイルの編集
def change
create_table :likes do |t|
t.references :user, foreign_key: true
t.references :record, foreign_key: true
t.timestamps
end
end
※一意性制約にするべきだったけど、何を試してもエラーになったので、とりあえずこのまま実装しました。
続いてルーティング
resources :records do
resources :comments, only: [:create, :destroy]
resource :likes, only: [:create, :destroy]
end
コントローラー
def create
like = current_user.likes.build(record_id: params[:record_id])
if like.save
redirect_back(fallback_location: root_path)
else
@record = like.record
like = @record.likes
redirect_back(fallback_location: root_path)
end
end
def destroy
user=current_user
record=Record.find(params[:record_id])
if like=Like.find_by(user_id: user.id,record_id:record.id)
like.destroy
redirect_back(fallback_location: root_path)
else
redirect_back(fallback_location: root_path)
end
end
※なんかコードが汚い
すべての機能やビューが整ったらリファクタリングをしよう
つづいてビューファイル
<% if user_signed_in? %>
<div class="option" >
<div class="favorite-btn">
<%= image_tag "star.png" ,class:"favorite-star-icon" ,width:"20",height:"20"%>
<p><span>お気に入り登録: </span><%=link_to @record.likes.count, record_likes_path(@record.id), method: :post %></p>
</div>
<div class="report-btn">
<%= image_tag "flag.png" ,class:"report-flag-icon" ,width:"20",height:"20"%>
<p><span>お気に入り解除: </span><%=link_to @record.likes.count, record_likes_path(@record.id), method: :delete %></p>
</div>
<div class="count-btn">
<p><span>お気に入りされた数: </span><%= @record.likes.count %></p>
</div>
<% else %>
<p>※※※お気に入りをするにはユーザー登録をしましょう※※※</p>
<% end %>
</div>
ログインしていないとお気に入り機能がでてこないように記述
完成品はこちら
今日の気づき
まだまだ自作のメソッド作って記述を減らしたり、応用を帰化していくのが苦手。。
動けばいいってわけではない。
ただ検索して調べる力はついてきたかな。
修練あるのみ。
次回予告
kaminariを利用してページネーションにチャレンジするとかしないとか。。
Discussion