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

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

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

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

Q&A

1回答

412閲覧

railsでpostにいいね機能を実装中

arayada

総合スコア10

Ruby on Rails

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

0グッド

0クリップ

投稿2018/11/24 07:43

編集2022/01/12 10:55

前提・実現したいこと

railsでいいね機能を作っています。ユーザー登録必要なしの簡易なものですが、エラーにはまってしまいました。
ご教授いただければ幸いです。

発生している問題・エラーメッセージ

No route matches [POST] "/likes/create"

該当のソースコード

ルーティング

Rails.application.routes.draw do root 'static_pages#home' get 'static_pages/home' get '/help', to: 'static_pages#help' get '/about', to: 'static_pages#about' get '/contact', to: 'static_pages#contact' post "/likes/:post_id/create", to: "likes#create" post "/likes/:post_id/destroy", to: "likes#destroy" get "/posts/:id", to: "posts#index" resources :posts do resources :likes, only: [:create, :destroy] end end

モデル

class Like < ApplicationRecord belongs_to :post counter_culture :post validates :post_id, {presence: true} end
class Post < ApplicationRecord validates :content, uniqueness: true, presence: true, length: { maximum: 30 } has_many :likes, dependent: :destroy end

ビュー

/likes/_like.html.erb <% if Like.find_by(post_id: @post.id) %> <%= link_to("/likes/#{@post.id}/destroy", method: :delete) do %> <span class="fa fa-heart like-btn-unlike"></span> <% end %> <% else %> <%= link_to("/likes/#{@post.id}/create", method: :create) do %> <span class="fa fa-heart like-btn"></span> <% end %> <% end %> <!-- 変数@likes_countを表示してください --> <%= @likes_count %>
/posts/index.html.erb <div class="vote-page"> <h1>投票する</h1> <ul class="list-unstyled"> <% @posts.each do |post| %> <li> <%= post.content %> <%= render "likes/like", post: post %> </li> <% end %> </ul> <%= render 'posts/form' %> </div>

コントローラー

class LikesController < ApplicationController def create @like = Like.new(post_id: params[:post_id]) @like.save redirect_to("/posts/#{params[:post_id]}") end def destroy @like = Like.find_by(post_id: params[:post_id]) @like.destroy redirect_to("/posts/#{params[:post_id]}") end end
class PostsController < ApplicationController def new @post = Post.new end def create @posts = Post.all @post = Post.new(post_params) if @post.save flash[:success] = "登録されました" redirect_to posts_url else render "index" end end def index @posts = Post.all @post = Post.new @like = Like.new counts(@post) end private def post_params params.require(:post).permit(:content) end end

補足情報(FW/ツールのバージョンなど)

リンク内容
こちらのサイトを参考にさせてもらいました。というか、ほぼコピペ…

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

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

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

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

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

guest

回答1

0

おそらくあげているviewの中の

<%= link_to("/likes/#{@post.id}/create", method: :create) do %>

を押した時のエラーかと思います。@post.idが空でpathが/likes//createとなってしまっており、それが、routes.rbで定義されていないpathのためno route matchesのエラーが起きているのでは無いかと推測できます。またmethod: :createではなくmethod: :postが正しいです。

投稿2018/11/24 08:52

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

arayada

2018/11/24 12:41

ご回答ありがとうございます! 実は最初ほかの方法で実装を試みたものの、post_idがみつからない、というエラーが解決できず、あきらめてこちらのコードに変えたのです。 もしよろしければ、ごちゃごちゃと見苦しくて申し訳ないのですが、追記した投稿機能関連のコードも確認していただけないでしょうか?
退会済みユーザー

退会済みユーザー

2018/11/24 13:32

今arayadaさんが何に困っているのかよくわからないのでどのように確認すれば良いのかわからないのですが、ざっと読んで気になったことをあげると、 ①method: :destroyではなくmethod: :delete ②resources :postsをroutes.rbで宣言しているので、postsに関するcrudのルートは作成されています。例えばpostsのindexページに飛びたい場合は、link_to posts_pathや redirct_to posts_path というような書き方が可能です。 ③resourcesでshowアクションに②と同様(単数形になりますが)の書き方ができ、かつidを引数で渡します。例)link_to post_path(@post) ④destroyアクションでredirect_to("/posts/#{params[:post_id]}") と書いていますが、消したものは存在しなくなるので、おそらくnot foundのエラーが発生します。 ⑤もしlikesをネストさせたいなら、 resources :posts do  resources :likes end という書き方が可能で、rails routes コマンドで確認したらわかりますが、期待通りのpathが出来上がるはずです。 ⑦上がっている「ビュー」がどこのものかわかりませんが、コントローラーを見る限り@post = Post.newしか無いので、@post.idは確実に存在しないだろうなという感じです。
arayada

2018/11/25 07:05

ご丁寧にありがとうござます。 恥ずかしながら、これだけ詳細に指摘していただいたにもかかわらず、いまだ解決にいたりません… ⑦のビューは、上がいいねボタンを表示する部分、下がいいね機能を実装するつもりの投稿を一覧表示する部分です。 @post.idを有効にするためにどこをどういじったらよいでしょうか?PostsControllerのindexアクションの@postをPost.find(params[:id])に変えてみたのですが、やはり「Couldn't find Post without an ID」のエラーが出てしまいます。
退会済みユーザー

退会済みユーザー

2018/11/25 14:23

できればビューのファイルパス(ディレクトリ)が知りたいですね。それがわからないとどのコントローラーと対応しているのか判断できないので。 @post = Post.new だとPostオブジェクトがインスタンス化されただけで、中身は空です。当然idも入っていません。一方 @post = Post.find(params[:id]) だと、id が params[:id]と一致するPostオブジェクトを取得することになります。当然idを含め他のカラムの値も挿入されています。 そして、railsで使っている「params[:id]」というのは、例えば http://localhost:3000/posts/1 の「1」の部分を取得していることになります。 今回は resources :posts, only: [:new, :create, :index] とあるように:showアクションを定義していないため例であげたURLにアクセスるとRouting Errorになるかと思います。
arayada

2018/11/26 06:58

引き続きお付き合いいただき、ありがとうございます。 ビューのファイルパスをコードの上部に表記しました。またroute.rbの内容も変更しました。 エラーは「Couldn't find Post without an ID」のままです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問