前提・実現したいこと
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
追記3
show.html.erb の _user_info.html.erb を render している部分を追記してください
ご指摘ありがとうございます。
追記いたしました!
_user_info.html を一時的に別のファイル名にして、
_user_info.html を作って <%= user %> とのみ記入して表示するとどうなりますか?
別のエラーが発生しました。 追記いたします。
新たに出たエラーは create アクションの中で
@new_book が定義されていないからだと思います。
<%= render 'books/post_book', book: @new_book %> をコメントアウトするか、
create で @new_book = Book.new としてエラーが出ない状態にしましょう。
そして render "users/_user_info" の部分がどう表示されるか教えてください。
@new_book = Book.new を追加し、同様の操作をいたしました。
エラー発生したので、追記編集いたします!
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 %>
ありがとうございます!
実装してみたところ、おそらく遷移先(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>
上記の部分です。
さきほどと同じ理由でのエラーです。また if 文で分岐させます。
そもそもですが、この show.html.erb は保存済みの @book を表示するためのものなので、
保存に失敗したときにこの show.html.erb を表示しようとすると管理が難しくなります。
(show.html.erb を編集するときに常に保存に成功した場合と失敗した場合を考えないといけない)
別の view を作った方が良いかもしれません。
丁寧にご回答ありがとうございます。
エラーメッセージのみの部分テンプレートが必要ということでしょうか?
@book.save でfalseの場合のrenderってshowであってますか?newのような気がするのですが
ご回答ありがとうございます。
bookの投稿フォーム(newにあたると思うのですが…。)を部分テンプレートにし、複数のViewで利用する仕様しており、show画面にも利用しています。
そして、最終的には保存できた場合もできていない場合も部分テンプレートを含んだshow画面に遷移し、保存に失敗した場合はその画面でエラーメッセージを出現させたいと考えております。
そのため@book.save でfalseの場合のrenderをshowにしているのですが、誤りなのでしょうか…?
初心者のため、この返答が正しいかも自信がありません。
お手数ですが、もし誤りがあればご指導いただけると幸いです。
意図してるならひとまず大丈夫です。
おそらく関係ないと思いますが、
_user_info.html の `<%= attachment_image_tag ... %>` の前後でuser変数の情報をログ出力できますか?
※ 一時的に `<%= attachment_image_tag ... %>` より下のコードをコメントアウトか削除しても大丈夫です。
一時的に `<%= attachment_image_tag ... %>` より下のコードを削除し,
同様の操作を行うと、追記3と同じエラーが検出されました。
> 前後でuser変数の情報をログ出力できますか?
ログには何か出力されましたか?
遷移先を誤っていることに気がつきました…大変申し訳ございません
遷移先はindex でした…。エラーについては解決致しました。
お騒がせしました。
エラーメッセージが反映されていないのでこちらの対応をしていきます。
みなさま本当にありがとうございました!
解決できてよかったです!
大変お騒がせいたしました…!
皆様にご丁寧な対応していただき大変心強く、嬉しかったです。
また機会がありましたらよろしくお願いいたします!
回答1件
あなたの回答
tips
プレビュー