質問(追記)
app/views/agrees/create.js.erbはmvcの動きの中で、どのタイミングで呼び出されるのでしょうか。
また、dbへ値をcontrollerのcreateアクションで渡した後に、呼び出すことは可能ですか。
自分なりに考えてみたこと
app/views/articles/show.html.erbにおけるjqueryがうまく作動しないことが原因だと思います。反対についても同じ構造なので、割愛します。イメージとしてはteratailにおける高評価と低評価をイメージしています。
コード
app/models/article.rb
class Article < ApplicationRecord has_many :votes, dependent: :destroy def vote_user(user_id) votes.find_by(user_id: user_id) end def agree_user(user_id) votes.find_by(user_id: user_id, agree:1) end end
app/models/user.rb
class User < ApplicationRecord has_many :votes, dependent: :destroy end
app/models/vote.rb
class Vote < ApplicationRecord belongs_to :user belongs_to :article end
app/views/articles/show.html.erb
<div id="agree_button_<%= @article.id %>"> <%= render partial: 'votes/agree', locals: { article: @article, votes: @votes} %> </div>
app/views/votes/_agree.html.erb
<% unless article.vote_user(current_user.id).blank? %> <% if article.agree_user(current_user.id) %> <%= link_to neutral_path(article.id), method: :patch, remote: true do %> <i class="far fa-grin fa-2x" style="color: #FFAAFF;"></i> <% end %> <% else %> <%= link_to agree_update_path(article.id), method: :patch, remote: true do %> <i class="far fa-grin fa-2x" style="color:#FFDDFF;"></i> <% end %> <% end %> <% else %> <%= link_to agree_path(article.id), method: :post, remote: true do %> <i class="far fa-grin fa-2x" style="color:#FFDDFF;"></i> <% end %> <% end %>
app/views/votes/agree.js.erb
$('#agree_button_<%= @article.id %>').html("<%= j(render partial: 'votes/agree', locals: {article: @article, votes: @votes}) %>"); alert('agree呼ばれた!!');
ここのalert('agree呼ばれた!!');
が初めはうまく作動していたのですが途中から作動しなくなりました。
app/controllers/agrees_controller.rb
class AgreesController < ApplicationController before_action :set_variables def create @vote = Vote.create(agree: 1, disagree: 0, user_id: current_user.id, article_id: params[:article_id]) @votes = Vote.where(article_id: params[:article_id]) @article.reload end def update vote = Vote.find_by(user_id: current_user.id, article_id: params[:article_id]) vote.update(agree: 1, disagree: 0) @votes = Vote.where(article_id: params[:article_id]) @article.reload end private def set_variables @article = Article.find(params[:article_id]) end end
config/routes.rb
Rails.application.routes.draw do post '/agree/:article_id' => 'agrees#create', as: 'agree' patch '/agree/:article_id' => 'agrees#update', as: 'agree_update' end
追記
おそらく、js.erbのファイルの置き場所とファイル名なども関係しているとは思います。
js.erbファイルがhtmlファイルのidもしくはクラスをどのように識別しているのか、
自分の理解が浅いかもしれません。
どうぞよろしくお願いします。
一度解決済にしたが、誤っていた内容
コントローラーの@article.reloadを
redirect_to "/articles/#{@article.id}"
に変更することで解決できました。
redirect_toに関するこちらのサイトが参考になりました。
redirect_toを使うと当然でしたが、ページ全体が更新されてしまって、js.erbが呼び起こされませんでした。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/11 00:51
2020/03/11 01:21 編集
2020/03/11 01:34
2020/03/11 01:44