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

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

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

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

Q&A

解決済

1回答

1341閲覧

NoMethodErrorを解消したい

Ms.suger

総合スコア3

Ruby on Rails

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

0グッド

0クリップ

投稿2021/10/24 23:33

編集2021/10/25 00:47

前提・実現したいこと

railsで簡単なブログを作る練習をしていたところ、エラーが出てしまいました。
エラーが出た場面としては、新規投稿を作成する際にあえて空白のエラーを出した際です。

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

##関連のありそうなソースコード

_user_info.html

Ruby

1 <h2>User info</h2> 2 <%= attachment_image_tag user, :profile_image, :fill, 100, 100, format: 'jpeg', fallback: "no_image.jpg", size:'80x80' %> 3 <table class="table"> 4 5 <tbody> 6 <tr></tr> 7 <tr> 8 <th>name</th><th><%= user.name %></th> 9 </tr> 10 11 <tr> 12 <th>introduction</th><th><%= user.introduction%></th> 13 </tr> 14 15 </tbody> 16 </table> 17 18 <div> 19 <% if user.id == current_user.id %> 20   <%= link_to edit_user_path(current_user) do%> 21   <i class="btn btn-lg btn-block border-dark fas fa-user-cog" style="color: darkgray;"></i> 22   <% end %> 23  <% else %> 24   <%= link_to user_path(current_user) do%> 25   <i class="btn btn-lg btn-block border-dark fas fa-user-cog" style="color: darkgray;"></i> 26   <% end %> 27  <% end %> 28 </div> 29

books_controller

Ruby

1class BooksController < ApplicationController 2 3 #新規投稿画面表示 4 def new 5 @book = Book.new 6 end 7 8 #投稿内容保存 9 def create 10 @book = Book.new(book_params) 11 @book.user_id = current_user.id 12 #falseならば、画像投稿ページを再表示 13 if @book.save 14 flash[:notice]="You have creatad book successfully." 15 redirect_to books_path 16 else 17 @user = current_user 18 @books = Book.all 19 render :show 20 end 21 end 22 23 #投稿リストを表示画面作成 24 def index 25 @books = Book.all 26 @new_book = Book.new #投稿の部分テンプレート 27 @user = current_user #user情報の部分テンプレート 28 end 29 30 #投稿詳細表示画面作成 31 def show 32 @book = Book.find(params[:id]) 33 @new_book = Book.new #投稿の部分テンプレート 34 @user = current_user #user情報の部分テンプレート 35 end 36 37 #投稿削除 38 def destroy 39 @book = Book.find(params[:id]) 40 @book.destroy 41 redirect_to books_path 42 end 43 44 #投稿編集 45 def edit 46 @book = Book.find(params[:id]) 47 end 48 49 def update 50 @book = Book.find(params[:id]) 51 if @book.update(post_params) 52 redirect_to request.referer 53 else 54 render :new 55 end 56 end 57 58# 投稿データのストロングパラメータ 59private 60 61def book_params 62 params.require(:book).permit(:title, :body) 63end 64 65end 66

def create の render :showを render :new に変更すると
問題なくエラーメッセージが出るので、部分テンプレートに問題があるところまでは
理解したのですが、手も足も出ません。
初心者でわからないことばかりですが、よろしくお願いいたします。

追記

情報が不足し大変申し訳ございません。追加いたします。

books/show.html

ruby

1<div class="container px-5 px-sm-0"> 2 <div class="row"> 3 4 <div class="col-md-3"><!--部分テンプレート全体--> 5 <%= render 'users/user_info', user: @user %> 6 <%= render 'books/post_book', book: @new_book %> 7 </div> 8 9<div class="col-md-8 offset-md-1"><!--User page全体--> 10<h2>Book detail</h2> 11 <table class="table"> 12 13 <tbody> 14 <tr> 15 <td><%= link_to user_path(@user.id) do%> 16 <%= attachment_image_tag @user, :profile_image, :fill, 10, 10, fallback: "no_image.jpg", size:'40x40' %><br> 17 <%= @book.user.name %><% end %></td> 18 <td><%= link_to book_path(@book) do %> 19 <%= @book.title %><!--book変数のtitleカラム(bookモデルに定義)--> 20 <% end %> 21 </td> 22 <td><%= @book.body %></td> 23 24 <% if @book.user == current_user %> 25 <td><%= link_to "Edit", edit_book_path(@book), class: 'btn btn-success btn-sm' %></td> 26 <td><%= link_to "Destroy", book_path(@book), method: :delete, data: { confirm: "本当に消しますか?" }, class: 'btn btn-danger btn-sm' %></td> 27 <% end %> 28 </tr> 29 </tbody> 30 </table> 31</div> 32</div> 33</div> 34

追記2

neko_daisuki 様のコメント対応
user_info.html を作って <%= user %> とのみ記入

出現したエラー

追記3

neko_daisuki 様のコメント対応

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

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

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

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

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

neko_daisuki

2021/10/25 00:02

show.html.erb の _user_info.html.erb を render している部分を追記してください
Ms.suger

2021/10/25 00:09

ご指摘ありがとうございます。 追記いたしました!
neko_daisuki

2021/10/25 00:27

_user_info.html を一時的に別のファイル名にして、 _user_info.html を作って <%= user %> とのみ記入して表示するとどうなりますか?
Ms.suger

2021/10/25 00:31

別のエラーが発生しました。 追記いたします。
neko_daisuki

2021/10/25 00:39

新たに出たエラーは create アクションの中で @new_book が定義されていないからだと思います。
neko_daisuki

2021/10/25 00:43

<%= render 'books/post_book', book: @new_book %> をコメントアウトするか、 create で @new_book = Book.new としてエラーが出ない状態にしましょう。 そして render "users/_user_info" の部分がどう表示されるか教えてください。
Ms.suger

2021/10/25 00:46

@new_book = Book.new を追加し、同様の操作をいたしました。 エラー発生したので、追記編集いたします!
neko_daisuki

2021/10/25 00:58

create で @book の save に失敗したので id がなく、リンクの生成に失敗してます。 persisted? は保存済みなら true 保存してないなら false を返します。 これを使って保存されてない場合はエラー部分のコードが走らないようにします。 <% if @book.persisted? %> <td><%= link_to book_path(@book) do %> <%= @book.title %><!--book変数のtitleカラム(bookモデルに定義)--> <% end %> </td> <% else %> <td></td><!-- とりあえず空のtd --> <% end %>
Ms.suger

2021/10/25 01:11

ありがとうございます! 実装してみたところ、おそらく遷移先(Book.show)に関するエラーが出てしまいました。 エラーは下記の通りです。 重ね重ね申し訳ございません。 ActionController::UrlGenerationError in Books#create Showing /home/ec2-user/environment/Bookers2/app/views/books/show.html.erb where line #34 raised: No route matches {:action=>"edit", :controller=>"books", :id=>nil}, missing required keys: [:id] line #34は <td><%= link_to "Edit", edit_book_path(@book), class: 'btn btn-success btn-sm' %></td> 上記の部分です。
neko_daisuki

2021/10/25 01:20

さきほどと同じ理由でのエラーです。また if 文で分岐させます。 そもそもですが、この show.html.erb は保存済みの @book を表示するためのものなので、 保存に失敗したときにこの show.html.erb を表示しようとすると管理が難しくなります。 (show.html.erb を編集するときに常に保存に成功した場合と失敗した場合を考えないといけない) 別の view を作った方が良いかもしれません。
Ms.suger

2021/10/25 01:34

丁寧にご回答ありがとうございます。 エラーメッセージのみの部分テンプレートが必要ということでしょうか?
satoshih

2021/10/25 01:35

@book.save でfalseの場合のrenderってshowであってますか?newのような気がするのですが
Ms.suger

2021/10/25 01:42

ご回答ありがとうございます。 bookの投稿フォーム(newにあたると思うのですが…。)を部分テンプレートにし、複数のViewで利用する仕様しており、show画面にも利用しています。 そして、最終的には保存できた場合もできていない場合も部分テンプレートを含んだshow画面に遷移し、保存に失敗した場合はその画面でエラーメッセージを出現させたいと考えております。 そのため@book.save でfalseの場合のrenderをshowにしているのですが、誤りなのでしょうか…? 初心者のため、この返答が正しいかも自信がありません。 お手数ですが、もし誤りがあればご指導いただけると幸いです。
satoshih

2021/10/25 02:13

意図してるならひとまず大丈夫です。 おそらく関係ないと思いますが、 _user_info.html の `<%= attachment_image_tag ... %>` の前後でuser変数の情報をログ出力できますか? ※ 一時的に `<%= attachment_image_tag ... %>` より下のコードをコメントアウトか削除しても大丈夫です。
Ms.suger

2021/10/25 02:59

一時的に `<%= attachment_image_tag ... %>` より下のコードを削除し, 同様の操作を行うと、追記3と同じエラーが検出されました。
satoshih

2021/10/25 03:01

> 前後でuser変数の情報をログ出力できますか? ログには何か出力されましたか?
Ms.suger

2021/10/25 03:20

遷移先を誤っていることに気がつきました…大変申し訳ございません 遷移先はindex でした…。エラーについては解決致しました。 お騒がせしました。 エラーメッセージが反映されていないのでこちらの対応をしていきます。 みなさま本当にありがとうございました!
satoshih

2021/10/25 03:31

解決できてよかったです!
Ms.suger

2021/10/25 03:46

大変お騒がせいたしました…! 皆様にご丁寧な対応していただき大変心強く、嬉しかったです。 また機会がありましたらよろしくお願いいたします!
guest

回答1

0

自己解決

遷移先をindexにし、解消しました。

投稿2021/10/25 03:46

Ms.suger

総合スコア3

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問