質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

932閲覧

【至急】Ajaxがリロードしないと機能しない。

hattin

総合スコア18

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2019/05/09 10:36

編集2019/05/10 09:07

現状
railsチュートリアルに沿って、アプリケーション開発をしています。いいね機能を搭載し、ajaxをつけてようとしているのですが、リロードしないと表示が変わりません。submitのボタンを押すと、その場では何も変化がないような挙動をし、リロードすると、いいね機能が実行され、画面にも変化が現れる状態です。以下に、関連していると思われるコードを載せておきます。ネット上にあるサイトを参考にして、turbolinksのgem,jsでの読み込みをコメントアウトしてあります。ほかに必要な情報があれば、手間をおかけしますがよろしくお願いします。読みづらいコードかもしれませんが、どうかよろしくお願いいたします。
エラーコード

ruby

1ActionView::Template::Error (undefined local variable or method `micropost' for #<#<Class:0x00000000051a4bb8>:0x00000000051d2888> 2Did you mean? micropost_url)

上記のエラーは、create.js.erb,destroy.js.erbの両方に見られます。
_micropost.html.erb内でeach文を使用して、@microposts.each do |micropost|としているのですが、jsファイルにはこのmicropostが検知されず、このエラーが出てしまっているのでしょうか?
コード

ruby

1(favorites_controller.rb) 2 3def create 4 @micropost = Micropost.find_by(id: params[:micropost_id]) 5 current_user.like(@micropost) 6 respond_to do |format| 7 format.html { redirect_back(fallback_location: root_path) } 8 format.js 9 end 10 end 11 12 def destroy 13 @micropost = Micropost.find(params[:micropost_id]) 14 current_user.unlike(@micropost) 15 respond_to do |format| 16 format.html { redirect_back(fallback_location: root_path) } 17 format.js 18 end 19 end

ruby

1(favorites/_like_button.html.erb) 2 3<%= form_for(current_user.favorites.build, remote: true) do |f| %> 4 <%= hidden_field_tag :micropost_id, micropost.id %> 5 <%= button_tag :type => "submit", :class => "star icon" do %> 6 <i class="fa fa-star-o" id="likes"><%= micropost.like_users.count %></i> 7 <% end %> 8<% end %>

ruby

1(favorites/_unlike_button.html.erb) 2 3<%= form_for(current_user.favorites.find_by(micropost_id: micropost.id), 4 html: { method: :delete }, 5 remote: true) do |f| %> 6 <%= hidden_field_tag :micropost_id, micropost.id %> 7 <%= button_tag :type => "submit", :class => "star icon" do %> 8 <i class="fa fa-star" id="likes"><%= micropost.like_users.count %></i> 9 <% end %> 10<% end %>

ruby

1(favorites/_like_form.html.erb) 2 3<% unless current_user?(micropost.user) %> 4 <div id="like_form"> 5 <% if current_user.like?(micropost) %> 6 <%= render 'favorites/unlike_button', micropost: micropost %> 7 <% else %> 8 <%= render 'favorites/like_button', micropost: micropost %> 9 <% end %> 10 </div> 11<% end %>

ruby

1(microposts/_microposts.html.erb) 2                 略 3 <div id="like_btn"> 4 <% if logged_in? %> 5 <%= render 'favorites/like_form', micropost: micropost %> 6 <% end %> 7 </div> 8                 略 9

ruby

1(favorites/create.js.erb) 2 3$("#like_form").html("<%= escape_javascript(render('favorites/unlike_button')) %>");

ruby

1(favorites/destroy.js.erb) 2 3$("#like_form").html("<%= escape_javascript(render('favorites/like_button')) %>");

ruby

1(config/application.rb) 2 3config.action_view.embed_authenticity_token_in_remote_forms = true

html

1<%= csrf_meta_tags %> 2<%= stylesheet_link_tag 'application', media: 'all','data-turbolinks-track': 'reload' %> 3<%= javascript_include_tag 'application','data-turbolinks-track': 'reload' %>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

下記のような修正で動きませんか?
エラーの該当箇所がよくわかりませんが、多分ここでいいのかなって感じました。

(favorites/create.js.erb) $("#like_form").html("<%= escape_javascript(render('favorites/unlike_button')) %>"); ↓ $("#like_form").html("<%= escape_javascript(render(partial: 'favorites/unlike_button', locals: { micropost: @ micropost })) %>");

favorites/destroy.js.erbも同様

投稿2019/05/27 08:34

odyu

総合スコア548

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hattin

2019/05/30 03:47

ご回答ありがとうございます。 ご教示して頂いたとおり記述したところ、解決いたしました! ずっと悩んでいたのでありがとうございます。
guest

0

コントローラで
@micropost = Micropost.find_by(id: params[:micropost_id])
としていますが、

ビュー_unlike_button.html.erbでは
micropost.idのようにローカル変数としてアクセスしているのでエラーになっているのではないでしょうか。

<%= render 'favorites/unlike_button', micropost: micropost %>
これに倣ってcreate.js.erbdestroy.js.erbも変数を渡してあげるように修正すれば解決するかもしれません。

『インスタンス変数』『ローカル変数』でググると参考記事がヒットすると思います。

投稿2019/05/20 03:18

daidai3110

総合スコア27

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hattin

2019/05/22 03:20

ご回答ありがとうございます。 favoritesコントローラではローカル変数で定義してあるので問題ないかと思っていたのですが、間違っているのでしょうか? なお、それぞれのボタンのビューにあるmicropostには、 @microposts.each do |micropost|のmicropostを引き継がせている状態です。
daidai3110

2019/05/22 08:06 編集

> favoritesコントローラではローカル変数で定義してある インスタンス変数の間違いでしょうか? >なお、それぞれのボタンのビューにあるmicropostには、 >@microposts.each do |micropost|のmicropostを引き継がせている状態です。 Ajaxでcreateアクションを動かした際はそのeach部分は動かないと思います。 ``` (favorites/create.js.erb) $("#like_form").html("<%= escape_javascript(render('favorites/unlike_button')) %>"); ``` この部分が動くのはわかりますか? それがわかればローカル変数としてmicropostが渡っていないのがわかると思います。 >_micropost.html.erb内でeach文を使用して、@microposts.each do |micropost|としている また余談ですがこれって「`index.html.erb`内で」の間違いですか? であればeach分で回さなくても`render @microposts`だけで自動的に`_micropost.html.erb`が繰り返し使われますよ。
hattin

2019/05/23 01:03

度々回答ありがとうございます。 僕の理解力がないのかもしれませんが、修正しても同じようなエラーを吐かれてしまいました。 修正したことは、 creata.js.erbとdestroy.js.erbに直接<%micropost=Micropost.find_by(id:params[:micropost_id])%>を入れ、 <%=render~~, micropost: micropost%>としました。 何度も質問すみません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問