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

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

詳細はこちら
Ruby

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

Ruby on Rails 6

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

Q&A

解決済

1回答

323閲覧

いいね機能の実装ができません

kimch

総合スコア8

Ruby

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

Ruby on Rails 6

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

0グッド

0クリップ

投稿2021/03/04 11:24

#ActionController::UrlGenerationErrorの解決をしたい
現在、個人でアプリを開発しているのですが、上記の様な現象が起きており、皆様の知恵をお借りしたく投稿させていただきます。

#version
ruby 2.6.5
rails 6.0.3.5
#コード

ruby

1business.rb 2 3class Business < ApplicationRecord 4 5 belongs_to :company 6 belongs_to :student 7 has_one_attached :image 8 has_many :likes,dependent: :destroy 9 10 with_options presence: true do 11 validates :content 12 validates :department 13 validates :period 14 validates :reward 15 validates :number 16 validates :comment 17 validates :skill 18 end 19 20 def self.search(search) 21 return Business.all unless search 22 Business.where('content LIKE(?)', "%#{search}%") 23 end 24 25 def liked_by?(student) 26 likes.where(student_id: student.id).exists? 27 end 28 29end 30

ruby

1likes_controller.rb 2 3class LikesController < ApplicationController 4 before_action :authenticate_user! 5 before_action :set_business 6 7 def create 8 business = Business.find(params[:business_id]) 9 student = current_student 10 like = Like.create(business_id: business.id, student_id: student.id) 11 end 12 13 def destroy 14 business = Business.find(params[:business_id]) 15 student = current_student 16 like = Like.find_by(business_id: business.id, student_id: student.id) 17 like.delete 18 end 19 20 private 21 def set_business 22 @business = Business.find(params[:business_id]) 23 end 24 25end 26

ruby

1index.html.erb 2 3<%= render "shared/header" %> 4 5 <div class="top_content"> 6 <h1> 7 業務一覧 8 </h1> 9 </div> 10 11 <div class="middle_content"> 12 <div class="company_information"> 13 <% @business.each do |business|%> 14 <%# <% link_to "#" do %> 15 <ul class="divided_company_info"> 16 <li class = "business_company_image"> 17 <%= image_tag business.image, class:"business_img" %> 18 </li> 19 <li class = "business_company_name"> 20 <%= %> 21 </li> 22 <li class="business_content"> 23 <%= business.content%> 24 </li> 25 <li class="business_reward"> 26 <%= business.reward%> 27 </li> 28 <div id="like-btn-<%= business.id %>"> 29 <%= render 'likes/like', business: business %> 30 </div> 31 </ul> 32 <%# <% end %> 33 <% end %> 34 </div> 35 </div> 36 37 <div class="low_content"> 38 <h1> 39 人気の業務一覧 40 </h1> 41 ここにいいね件数の多い会社を出力する 42 </div> 43 44 45<%= render "shared/footer" %>

routes

1ルーティング 2 3resources :companies, only: [:index, :show, :edit] do 4 resources :businesses, only: [:index, :new, :create] do 5 resources :likes, only:[:create, :destroy] 6 end 7 end

ruby

1_likes.html.erb 2 3<% if business.liked_by?(current_student) %> 4 <%= link_to(company_business_like_path(business.id), method: :delete, remote: true, id: :"like-button-#{business.id}") do %> 5 <i class="fa-lg fas fa-heart icon-btn liked"></i> 6 <% end %> 7<% else %> 8 <%= link_to(company_business_likes_path(business.id), method: :post, remote: true, id: :"like-button-#{business.id}") do %> 9 <i class="fa-lg fas fa-heart icon-btn not-like"></i> 10 <% end %> 11<% end %>

#エラーコード

ActionController::UrlGenerationError in Businesses#index Showing /Users/takayoshikanamoto/projects/C×S/app/views/likes/_like.html.erb where line #6 raised: No route matches {:action=>"create", :company_id=>9, :controller=>"likes"}, missing required keys: [:business_id]

#試したこと
エラー画面にて出力されている通り、部分テンプレートファイル内のlink_to(company_business_likes_path(business.id)の`(business.id)において、business_idに紐づくキーが存在していないことが原因ではないかと考え、以下の作業をした。

1、エラー画面にて、@businessの中身を確認し、business_idとその値が存在することを確認した。
2、business.idにより、9というIDが出力されることも確認した。

上記から、business.idで値が出力されているため、必要な情報は与えられているのでは?と考えた。
また、記述等に誤りがないかも調べたがやはり解決できなかった。

非常に読みにくい文章となったしまいましたが、
何卒、よろしくお願い申し上げます。

#参考にした記事
https://qiita.com/soehina/items/a68ab66da3ea1d260301

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

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

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

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

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

guest

回答1

0

ベストアンサー

erb

1<%= link_to(company_business_like_path(business.id), method: :delete, remote: true, id: :"like-button-#{business.id}") do %> 2--- 3<%= link_to(company_business_likes_path(business.id), method: :post, remote: true, id: :"like-button-#{business.id}") do %>

上記のcompany_business_likes_path(business.id)に問題があります。
このパスを生成するには company と business の id が必要ですが、ひとつしか指定されていません。

引数に business.id を渡しているので business は指定されているように見えますが、
これは company の id として解釈されています(引数の順番の問題です)。

company_business_likes_path(company.id, business.id) のようにする必要があります。
company の id はパスに含まれているはずなので、params[:company_id] で取得できます。

投稿2021/03/05 05:09

neko_daisuki

総合スコア2090

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

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

kimch

2021/03/05 06:38

ご回答いただきありがとうございます。 ルーティングにおいてネストをしていたため、link_toで指定するためには2のデータの指定の仕方をしなかればならなかったという解釈をしました。 知識不足で大変申し訳ございません。 おかげさまで今回表示さレていたエラーに関しては解決することができました。 わかりづらい文章であったにもかかわらず快くご回答いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問