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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

12150閲覧

Railsでcreate.js.erbが動かない為、どこに問題があるか知りたい

Test_ks

総合スコア33

Ruby on Rails

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2016/04/08 03:50

編集2016/04/08 09:14

期待している動作としては、パーシャル部分をボタン押下によって切り替える処理をしたいと思っています。
しかし、create.js.erbでのJavascript部分が動作していないようです。(
「render('likeideas/like_idea', idea:@idea」部分は正常に動いていますが、パーシャル部分が切り替わりません。)
どこに問題があるのかご教授いただけないでしょうか。

view.html.erb(ideaという変数を使用しています。)

html

1 <td class = "right-ideas" style=" width: 10%" > 2 <div class = "icon"> 3 <% if idea.like_idea_find_by(current_user) %> 4 <%= render partial: 'likeideas/like_idea', locals: { idea: idea} %> 5 <% else %> 6 <%= render partial: 'likeideas/notlike_idea', locals: { idea: idea} %> 7 <% end %> 8 </div> 9 </td>

_like_idea.html.erb(Destroyメソッドを読んでいます。)

html

1<%= link_to likeidea_path(id: Likeidea.find_by(idea_id: idea.id,user_id:current_user), idea_id: idea.id ) , :class => "like-icon",:id => "#{idea.id}", :remote => true, :method => :delete do %> 2 <span class="like-icon"><%= fa_icon "heart" %></span> 3<% end %> 4<%= idea.likeideas.count %>

_notlike_idea.html.erb(createメソッドを読んでいます。)

html

1<%= link_to likeideas_path( idea_id: idea.id ) , :class => "notlike-icon",:id => "#{idea.id}", :remote => true, :method => :post do %> 2 <span class="notlike-icon"><%= fa_icon "heart" %></span> 3<% end %> 4 <%= idea.likeideas.count %>

controller

ruby

1 def create 2 @idea = Idea.find(params[:idea_id]) 3 likeidea = current_user.likeideas.build do |t| 4 t.idea_id = params[:idea_id] 5 end 6 7 if likeidea.save 8 else 9 end 10 11 end 12 def destroy 13 @idea = Idea.find(params[:idea_id]) 14 if Likeidea.delete(params[:id]) 15 else 16 end 17 end

create.js.erb

html

1$("#<%= @idea.id %>").replaceWith("<%= escape_javascript(render('likeideas/like_idea', idea:@idea )) %>");

destroy.js.erb

html

1$("#<%= @idea.id %>").replaceWith("<%= escape_javascript(render('likeideas/notlike_idea', idea:@idea )) %>");

routes

HTML

1 resources :likeideas, :only => [:create, :destroy]

よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

この手のエラー、原因の切り分けに結構困りますよね。
私の場合、以下の手順でチェックしてみます。

1.JSがきちんと呼び出されているか、console.logとかを使ってチェック
2.JSの操作対象である要素IDがきちんと存在しているか、重複したりしていないかチェック
3.操作対象セレクタが正しく操作できるか、背景色を変えるなどの操作をして見てチェック
4.置き換え対象のレンダラが正しくレンダリングされているかチェック

ざっと見たところ、JSで呼び出しているescape_javascript(render~のあたりが怪しそうな気がします。

投稿2016/04/08 05:48

rifuch

総合スコア1901

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

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

Test_ks

2016/04/08 05:52 編集

回答ありがとうございます。 create.js.htmlの中身をalert("hello");と変えてもAlertが出てこない為、原因は、create.js.jtmlだと思うのですが、なぜ、ここだけJavascriptが動かないのか不明です。 上記の手順では、やって見ましたが、動きませんでした。
rifuch

2016/04/08 05:53

怪しそうなところを外してましたね。 create.js.htmlが呼び出されていないという事で気づきましたが、 ファイル名はcretate.js.erbじゃないとだめな気が・・・
Test_ks

2016/04/08 05:58 編集

上記のファイル名が間違っていました。実際のファイル名はcreate.js.erbで行っています。また、ログには、 Rendered likeideas/_like_idea.html.erb (3.4ms) Rendered likeideas/create.js.erb within layouts/application (15.8ms) と表示されているので、呼びだされてはいると思います。
rifuch

2016/04/08 06:26

上記1〜4全て問題なしでしたか?
Test_ks

2016/04/08 07:39

はい、上記1〜4は問題は無かったです。
rifuch

2016/04/08 07:46

3まできちんとブラウザ上で確認出来ていて、さらに4も大丈夫で、きちんと動かない、というのは不可解ですね・・・ 試しに、DOMをリプレースするんじゃなくて、どこかにappendするとかしてそれがきちんとブラウザ上で再現できるか見てみては?
Test_ks

2016/04/08 07:58

単純に、create.js.erbの中にalert("hello");とかいてもブラウザでは再現しませんでした。
rifuch

2016/04/08 08:55

あー、それは、1.のチェックがすでに問題かもしれないと。 create.js.erbの中身を全て削除して、alert("hello");だけにするとか、 console.log('hello");だけにするとかで呼び出されているか確認出来ませんか? 他のJSコードが原因で全部こけてる可能性はないですか?
Test_ks

2016/04/08 09:05

create.js.erbをalert("hello");だけにして見ましたが、呼びだされませんでした。ログには、 Rendered likeideas/create.js.erb within layouts/application (0.5ms) と書かれており、render は正しく行われているようです、
Test_ks

2016/04/08 09:41

create.js.erbは呼ばれているが、その内部に記述されたJavascriptは実行されていないようですが、何が原因か分かりますでしょうか?
rifuch

2016/04/08 17:29

within layouts/applicationが気になりますね。 remoteでの呼び出しは、レイアウトが考慮されないはずなのですが・・・
rifuch

2016/04/08 17:44

<%= link_to likeidea_path(id: Likeidea.find_by(idea_id: idea.id,user_id:current_user), idea_id: idea.id ) , :class => "like-icon",:id => "#{idea.id}", :remote => true, :method => :delete do %>の順序を入れ替えて、<%= link_to likeidea_path(id: Likeidea.find_by(idea_id: idea.id,user_id:current_user), idea_id: idea.id ) , :remote => true, :method => :delete, :class => "like-icon",:id => "#{idea.id}" do %>にしてみたらどうなりますか? もしかすると、オプションの順序がurl_optionとhtml_optionでごっちゃになっているせいで、うまいことurl_optionであるremote: trueが働いていないかもしれません。
rifuch

2016/04/08 17:48

link_toにきちんとオプションが渡っているかどうかは、ブラウザでレンダリングされたソースを確認して、対象のaタグにdata-remote="true"の属性があるかで判断できます
Test_ks

2016/04/08 22:17

aタグにはそのままでもdata-remote="true"がありますね。
Test_ks

2016/04/10 03:13 編集

上記のサイトを参考に既に試しています。他のJavaScriptの処理も試しては見たのですが、正常に動きました。(HeaderとBody共にJavascriptを追加して確認しました。また、CoofeeScriptを呼び出しての処理も正常に動きます。)また、TurbolinkをOffにして実行もしているのですが、動きません。 仮にソース上の問題で無く、Turbolinkの問題でも無いケースであるとどこに問題があるのか検討が付かない状態です。 何か思い当たりますでしょうか。
guest

0

application.html.erbとすべき箇所をapplication.erbとしていたため。ソース自体の問題では無かった。

投稿2016/04/14 01:20

Test_ks

総合スコア33

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

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

rifuch

2016/04/14 01:26

無事解決して良かったです。 お役に立てず、申し訳ありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問