🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

Q&A

解決済

1回答

552閲覧

いいね!機能のRoutesがうまく渡らない(リレーション)【Rails】

tomtom1

総合スコア168

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

0グッド

0クリップ

投稿2020/11/26 10:03

###知りたいこと
いいね!機能を実装中。いいね!を押すと、"likes/create"に飛ばしたいが、
Routes「No route matches」のエラーが発生します。原因を知りたいです。
参考サイト:https://qiita.com/nojinoji/items/2c66499848d882c31ffa

Routes

1Rails.application.routes.draw do 2 post "likes/:id/create" => "likes#create" ←こちら! 3 get 'users/index' => "users#index" 4 get "signup" => "users#new" 5 post "users/create" => "users#create" 6 get "posts/index" => "posts#index" 7 get "posts/new" => "posts#new" 8 post "posts/create" => "posts#create" 9. 10. 11 12end

→No route matches [GET] "/posts" と、エラー発生
なので、外してRoutesから外すと、

Routes

1Rails.application.routes.draw do 2 get 'users/index' => "users#index" 3 get "signup" => "users#new" 4 post "users/create" => "users#create" 5 get "posts/index" => "posts#index" 6 get "posts/new" => "posts#new" 7 post "posts/create" => "posts#create" 8. 9. 10 11end

→No route matches [POST] "/likes/1/create" と、エラー発生
このようにRoutesがマッチしないというエラーが出てしまいます。

terminal

1$ rails g model like post:references user:references content:string 2$ rails db:migrate

model

1class Likee < ApplicationRecord 2 belongs_to :user 3 belongs_to :post 4end 5class User < ApplicationRecord 6 has_many :posts, dependent: :delete_all 7 has_many :likes 8end 9class Post < ApplicationRecord 10 belongs_to :user 11 has_many :likes 12end

view

1<%= link_to "/likes/#{@post.id}/create", :method => :post, content: "like" do %>いいね!<% end %>

controller

1def create 2 @like = Like.create(user_id: @current_user.id, post_id: params[:id], content: params[:content]) 3 @post = @like.post 4 redirect_to("/posts") 5 end

(通常Likeにcontentは不要かと思いますが、特別な理由で入れています)

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

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

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

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

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

guest

回答1

0

ベストアンサー

redirect_to("/posts")

これによってリダイレクトされているが、この時の動作がブラウザによって若干異なる事があります。
(標準文書を解釈するとpostのままが正しい気もするが大抵の場合はgetに変えてしまうのでややこしい
さらにpjax/ajaxが絡むと結果が変わったり)
postのままリダイレクトするか、getにメソッドを変えてリダイレクトするか
あなたがご使用のブラウザがたまたま(?)postのままリダイレクトするタイプだったのでしょう。

ruby

1redirect_to("/posts", status: :see_other)

とする事でgetを強制できます。(対応ブラウザの場合)

投稿2020/11/26 18:26

asm

総合スコア15149

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

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

tomtom1

2020/11/27 12:59

現在のコードではLikeが生成されていなかったことから、単純にcreateへリンクが飛んでいないと思っていましたが、その後のredirectでしたか!気づかずにいました!無事解決できそうです!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問