###前提・実現したいこと
クリックしたいいねリンクをajaxでいいねを取り消すへ切り替えたい。
このようにクリックしたリンクがajaxにより切り替わるようにしたいです。
###発生している問題・エラーメッセージ
小泉(Userモデル)というユーザーがtest1とtest2という投稿をしており、
Shop(Shopモデル)というユーザーが小泉のtest2の投稿にいいねをする場合です。(私は小泉という苗字ではないんですが!)
test2投稿のいいねを押すと
test1の投稿のajaxが作動します。。。↓
データの流れる順番にコードを書いていきます。
①いいねを押す
【micropost.html.erb】(いいねのリンクが貼ってあるファイル)
<% if shop_signed_in? %> <div id="sympathizes_ajax"> <%= render 'sympathizes/sympathize_links', micropost: micropost %> </div> <% end %>
↓①いいねを押す
【sympathizes/_sympathize_links.html.erb】
<% if micropost.sympathized_by? current_shop %> <%= link_to 'いいね!を取り消す', micropost_sympathizes_path(micropost.id), method: :delete, remote: true %> <% else %> <%= link_to 'いいね!', micropost_sympathizes_path(micropost.id), method: :post, remote: true %> <% end %>
↓②createアクションへ
【sympathizes.controller.rb】
def create @micropost = Micropost.find(params[:micropost_id]) @sympathize = current_shop.sympathizes.build(micropost: @micropost) @sympathize.save end def destroy @micropost = Micropost.find(params[:micropost_id]) @sympathize = current_shop.sympathizes.find_by!(micropost_id: params[:micropost_id]) @sympathize.destroy end
@sympathizeにデータが入り保存される。
↓
③ここで、create.jsファイルが起動!
【sympathizes/create.js.erb】
$('#sympathizes_ajax').html('<%= escape_javascript(render("sympathizes/sympathize_links", micropost: @micropost)) %>');
↓
ここで、いいね→いいねを取り消すとなります。
④もう一度クリックすると
↓
【sympathizes/destroy.js.erb】
$('#sympathizes_ajax').html('<%= escape_javascript(render("sympathizes/sympathize_links", micropost: @micropost)) %>');
↓
いいねを取り消す→いいねに切り替わります。
これかな?と思った原因を一応書きます
(ここから違っていればガンガンご指摘お願いします。)
・createもしくはdestroyファイルのデータの送信先が指定されていないために、
下のいいねをクリックすると上のいいねにデータが送られてしまう。(上のいいねはクリックするといいねを取り消すに切り替わります。下のいいねの表示は切り替わりません。)
ですので、createとdestroyのデータ送信先を区別できるような方法をとればいいのか。。。?
と思ったのですが、まったく想像がつかずご相談にあがりました。。。
ユーザーの関連づけコードも載せておきます。
【shop.rb】
#sympathizes(shop-to-micropost.user) has_many :microposts, dependent: :destroy has_many :sympathizes, dependent: :destroy has_many :sympathize_microposts, through: :sympathizes, source: :micropost
【micropost.rb】
#sympathizes(shop-to-micropost.user) has_many :sympathizes, dependent: :destroy has_many :sympathize_users, through: :sympathizes, source: :shop belongs_to :shop
【sympathize.rb】
belongs_to :shop belongs_to :micropost validates :shop, presence: true validates :shop_id, uniqueness: { scope: :micropost_id } validates :micropost, presence: true
回答2件
あなたの回答
tips
プレビュー