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

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

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

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

Q&A

1回答

971閲覧

Ruby on rails いいね機能でRouting Error

qoo12

総合スコア0

Ruby on Rails

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

0グッド

1クリップ

投稿2023/02/12 06:53

編集2023/03/27 17:51

実現したいこと

Ruby on railsでいいね機能をつけるためにコードを記述したのですが、routing errorが出てうまくいきません。いいねが0の状態で、いいねを押すとこの画面が出ました。このエラーを解決したいです。

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

error画面

Routing Error No route matches [GET] "/tweets/4/likes"

コマンドプロンプト rails routes実行画面

tweet_likes POST /tweets/:tweet_id/likes(.:format) likes#create tweet_like DELETE /tweets/:tweet_id/likes/:id(.:format) likes#destroy tweets GET /tweets(.:format) tweets#index POST /tweets(.:format) tweets#create new_tweet GET /tweets/new(.:format) tweets#new edit_tweet GET /tweets/:id/edit(.:format) tweets#edit tweet GET /tweets/:id(.:format) tweets#show PATCH /tweets/:id(.:format) tweets#update PUT /tweets/:id(.:format) tweets#update DELETE /tweets/:id(.:format) tweets#destroy

routes.rb画面

Rails.application.routes.draw do devise_for :users # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html get 'hello/index' => 'hello#index' get 'hello/link' => 'hello#link' resources :tweets do resources :likes, only: [:create, :destroy] end end

links_controller画面

class LikesController < ApplicationController def create like = current_user.likes.create(tweet_id: params[:tweet_id]) redirect_back(fallback_location: root_path) end def destroy like = Like.find_by(tweet_id: params[:tweet_id], user_id: current_user.id) like.destroy redirect_back(fallback_location: root_path) end end

index.html画面

<%= stylesheet_link_tag 'index', :media => "all" %> <%= page_entries_info @tweets %> <div class="tweets-container"> <h1>Geektwitter</h1> <%= button_to 'ログアウト', destroy_user_session_path, method: :delete %> <h3>Tweet一覧</h3> <h3>投稿を検索</h3> <%= form_tag({controller:"tweets",action:"index"}, method: :get) do %> <%= text_field_tag :search %> <%= submit_tag '検索する' %> <% end %> <% @tweets.each do |t| %> <div class="tweet"> <%= t.user.email %> <div class="main-box"> <div class="left-container"><%= t.body %></div> <%= image_tag t.image_url, size: "250x200" if t.image? %> <% if user_signed_in? %> <% if current_user.already_liked?(t) %> <%= link_to tweet_like_path(id: t.id, tweet_id: t.id), method: :delete do %> <i class="fas fa-heart"></i><%= t.likes.count %> <% end %> <% else %> <%= link_to tweet_likes_path(id: t.id, tweet_id: t.id), method: :post do %> <i class="far fa-heart"></i><%= t.likes.count %> <% end %> <% end %> <% else %> <i class="far fa-heart"></i><%= t.likes.count %> <% end %> <div class="right-container"> <%= link_to "詳細", tweet_path(t.id) %> <%= link_to "編集", edit_tweet_path(t.id) %> <%= link_to "削除", tweet_path(t.id), method: :delete %> </div> </div> <p class="time"><%= t.created_at %></p> </div> <% end %> <%= paginate @tweets %> </div>

試したこと

routes.rbの記述、createアクションのpathの確認はしました。
エラー画面でpostメゾットではなくgetメゾットになっていて混乱しています。
プログラミングを始めたばかりで、勉強不足なのは重々承知していますが、答えて頂けると幸いです。

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

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

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

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

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

yuma.inaura

2023/02/12 12:32

コードはテキストで載せておきませんか
qoo12

2023/02/12 14:45

すみません 修正しましたが、これで大丈夫でしょうか?
matsubokkuri

2023/03/01 04:59

コードをパット見た感じでは動きそうですが。。。 細かいところですが、 `<%= link_to tweet_likes_path(id: t.id, tweet_id: t.id), method: :post do %>` は `<%= link_to tweet_likes_path(tweet_id: t.id), method: :post do %>` かなと思います。
guest

回答1

0

コードは問題なくて、ujsが読み込まれていないからリンクが上手く機能していないです。

methodパラメータのdeleteやcreateが指定されたときのリンクの書き換えはujsが行ってます。

テストのためにujsに依存しないコードは以下です。

html

1<!-- 省略 --> 2 3<% if user_signed_in? %> 4 <% if current_user.already_liked?(t) %> 5 <%= button_to '', tweet_like_path(id: t.id, tweet_id: t.id), method: :delete do %> 6 <i class="fas fa-heart"></i><%= t.likes.count %> 7 <% end %> 8 <% else %> 9 <%= button_to '', tweet_likes_path(id: t.id, tweet_id: t.id), method: :post do %> 10 <i class="far fa-heart"></i><%= t.likes.count %> 11 <% end %> 12 <% end %> 13<% else %> 14 <i class="far fa-heart"></i><%= t.likes.count %> 15<% end %> 16 17<!-- 省略 -->

投稿2023/03/27 08:51

matsubokkuri

総合スコア744

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問