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

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

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

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

Q&A

解決済

1回答

2042閲覧

rake routesのurlはあってるはずなのにルーティングが通らない

naoya.n

総合スコア26

Ruby on Rails

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

0グッド

0クリップ

投稿2018/04/07 08:20

編集2018/04/08 08:52

railsのwebアプリでいいね機能を実装したいです。

ルーティングが間違っているのか、chromeでlocalhostで検証していいねのボタンをクリックしたところ、ビューには何も変化はなく、コンソールでは

色付きのハートクリック時(destroy)
POST http://localhost:3000/translations/103/likes/2 404 (Not Found)
色なしのハートクリック時(create)
POST http://localhost:3000/translations/104/likes 404 (Not Found)

となっており、ルーティングがうまく行ってないみたいなのですが、どこが悪いのかよく分かりません。
どなたか教えていただけませんか!!

コンソールでrake routesすると、
translation_likes POST /translations/:translation_id/likes(.:format) likes#create
translation_like DELETE /translations/:translation_id/likes/:id(.:format) likes#destroy
となってます。

likes controllerのdestroyのはじめにbinding.pryをつけても同じエラーなので、likes#destroy(またはcreate)にパスが通ってないみたいです、、

ブラウザの検証のコンソールで確認できるurlとrake routesでのurlは一致しているように見えるのですがなぜか通りません。

routes.rb

ruby

1 resources :translations do 2 resources :likes, only: [:create, :destroy] 3 end

show.html.erb

ruby

1<% @translations.each do |translation| %> 2... 3 <%= render "likes/like", translation:translation %> 4... 5<% end %>

likes/_like.html.erb

ruby

1<% if translation.like_user(@current_user.id) %> 2 <%= button_to translation_like_path(translation_id: translation.id), 3 method: :delete, id: "like-button", class: "btn-like", remote: true do %> 4 <%= image_tag('/icons/like-red.png') %> 5<% end %> 6 7<%= button_to translation_likes_path(translation_id: translation.id), id: "like-button", class: "btn-like", remote: true do %> 8 <%= image_tag('/icons/like.png') %> 9<% end %>

likes/destroy.js.erb

js

1$("#like-button").html("<%= j(render partial: 'like', locals: { translations: @translations, likes: @likes }) %>");

likes/create.js.erb

js

1$("#like-buttons").html("<%= j(render partial: 'like', locals: { translations: @translation, likes: @likes, like: @like}) %>")

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

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

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

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

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

guest

回答1

0

ベストアンサー

これだけでは原因がはっきりしないので、以下の情報も追記してください。

  • コントローラのコード(全体)
  • リンククリック時にコンソール(ログ)に出力されている内容すべて(Started XXXで始まる行から、出力がなくなる最後まで)

現時点でわかっている内容から、あえて原因をエスパーするなら、404エラーになっているので、translationやlikeのfindに失敗している可能性があります。

もしかすると次のようなコードを書いているのではないでしょうか?

ruby

1class LikesController < ApplicationController 2 before_action :set_translation 3 before_action :set_like 4 5 # 省略 6 7 def destroy 8 @like.destroy 9 end 10 11 private 12 13 def set_translation 14 # params[:translation_id]ではなく、params[:id](like側のID)を指定しているため、findに失敗する 15 @translation = Translation.find(params[:id]) 16 end 17 18 def set_like 19 @like = @translation.likes.find(params[:id]) 20 end 21end

投稿2018/04/08 22:13

jnchito

総合スコア357

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

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

naoya.n

2018/04/09 11:42

すみませんご指摘を受けてコントローラを見直したところ解決しました!!ありがとうございます。
naoya.n

2018/04/09 12:28

モデルに置くべきバリデーションをコントローラに書いてしまってパスがコントローラに通るのを妨げていました。。丁寧な回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問