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

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

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

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

1回答

717閲覧

一覧ページから詳細ページへ遷移ができるように実装したい

k.shimazaki

総合スコア1

Ruby on Rails

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2021/06/05 07:07

前提・実現したいこと

link_toを使用して一覧ページから詳細ページへ遷移ができるように実装したいが
ActionController::UrlGenerationErrorがでてしまう。
もし解決方法がわかる方がいらしたらご教示願います。

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

ActionController::UrlGenerationError in Contents#index No route matches {:action=>"show", :book_id=>6, :controller=>"contents"}, missing required keys: [:id]

該当のソースコード

controller

1# contents_controller.rb 2class ContentsController < ApplicationController 3 before_action :authenticate_user!, only: [:new, :edit, :destroy] 4 before_action :set_content, only: [:show, :edit] 5 before_action :move_to_index, only: [:edit] 6 7 def index 8 @contents = Content.includes(:book).order("created_at DESC") 9 end 10 11 def new 12 @content = Content.new 13 end 14 15 def create 16 content = Content.create(content_params) 17 if content.save 18 redirect_to book_content_path(@content.id) 19 else 20 render :new 21 end 22 end 23 24 def destroy 25 content = Content.find(params[:id]) 26 content.destroy 27 redirect_to action: :index 28 end 29 30 def edit 31 end 32 33 def update 34 content = Content.find(params[:id]) 35 content.update(content_params) 36 if content.update(content_params) 37 redirect_to content_path 38 else 39 @content = Content.find(params[:id]) 40 render :edit 41 end 42 end 43 44 def show 45 end 46 47 private 48 49 def content_params 50 params.permit(:chapter, :write_down, :wrap_up, :action_plan).merge(book_id: params[:book_id]) 51 end 52 53 def set_content 54 @content = Content.find(params[:id]) 55 end 56 57 def move_to_index 58 unless current_user.id == @content.user.id 59 redirect_to action: :index 60 end 61 end 62end

views

1# index.html.erb 2<main class="main"> 3 <div class="inner"> 4 <% if user_signed_in? && current_user.id #== content.user.id %> 5 <div class="greeting"> 6 <%= link_to "内容の新規投稿", new_book_content_path, class: :greeting__link%> 7 </div> 8 <% end %> 9 <div class="card__wrapper"> 10 <%= render partial: 'content', collection: @contents %> 11 </div> 12 </div> 13</main>

view

1# _content.html.erb 2<div class="card"> 3 <div class="card__body"> 4 <%=link_to content.chapter, book_content_path(content.id) %> 5 </div> 6</div>

仮説

・content.idの取得ができていないのではないかと思っている。
・遷移先のpathが間違っているのではないか。

試したこと

・contents_controllerの記述確認。
(ここが間違っていると思うが正しい記述がわからない)
・routesでのpathの確認。

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

rails 6.0.0
mysql2 0.5.3

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

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

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

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

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

guest

回答1

0

ベストアンサー

rails routes を見直してください。
book_content_path があるならば、それは book.id も必要なはずです。
book_content_path(content.id) では contentのidがbookのidに取られています。
book_content_path(content.book_id, content.id) かな?

投稿2021/06/06 01:43

winterboum

総合スコア23567

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

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

k.shimazaki

2021/06/06 11:54 編集

book_content_path(content.book_id, content.id) と記述したら問題が解決しました。 ありがとうございます! controllerを修正して、idは取得できていたのですがそれでもうまくいかなくて、諦めていましたw 本当にありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問