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

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

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

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

Ruby on Rails

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

Q&A

1回答

1952閲覧

Ruby on Rails5で投稿に失敗したとき直前の投稿内容を表示したい

mimimi7_23

総合スコア11

Ruby on Rails 5

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

Ruby on Rails

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

0グッド

0クリップ

投稿2018/12/19 15:23

編集2018/12/20 02:46

追加:気づき

renderを使うと読み込まない(?)から@topic.titleが取得できないのでしょうか??
topicの詳細画面内にpostを表示したりpostの投稿フォームを入れるとなると、renderは使えないのでしょうか?

前提・実現したいこと

Ruby on Railsを勉強中です。
掲示板のようなwebアプリケーションを作るためRailsで電子掲示板を作成するチュートリアル | qs Developersを主に参考にしています。

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

エラー画面

該当のソースコード

app/views/topics/show.html.erb

Ruby

1<div class="main topics-show"> 2 <div class="container"> 3 <div class="topics-show-items"> 4 <div class="inline-block"> 5 <div class="topics-show-item"> 6 7 8 <h1><%= @topic.title %></h1> 9 10 <% @posts.each_with_index do |post , idx| %> 11 <p> 12 <%= idx + 1 %>. <%= post.name %><%= post.seats %>【<%= post.rating %>】 13 </br><%= post.body %> 14 </p> 15 <% end %> 16 17 </div> 18 </div> 19 20 <div class="inline-block"> 21 <div class="topics-new-item"><h3>座席レポートをする</h3> 22 <%= form_for @newpost, :url => post_create_path do |f| %> 23 <p>名前</p> 24 <p><%= f.text_field :name %></p> 25 26 <p>座席番号</p> 27 <p><%= f.text_field :seats %></p> 28 29 <p>評価</p> 30 <p><%= f.select :rating, [["★☆☆☆☆", "★☆☆☆☆"],["★★☆☆☆", "★★☆☆☆"],["★★★☆☆", "★★★☆☆"],["★★★★☆", "★★★★☆"],["★★★★★", "★★★★★"]] %></p> 31 32 <p>詳細</p> 33 <p><%= f.text_area :body %></p> 34 35 <%= f.hidden_field :topic_id %> 36 <%= f.submit(["投稿する"]) %> 37 <% end %> 38 39 </div> 40 </div> 41 </div> 42 </div> 43</div>

app/controllers/post_controller.rb

Ruby

1class PostController < ApplicationController 2 3def create 4 @post = Post.new( 5 params[:post].permit(:topic_id, :name, :seats, :rating, :body)) 6 if @post.save 7 redirect_to topics_show_path(params[:post]['topic_id']) 8 else 9 render("topics/show") 10 end 11end 12end

app/controllers/topics_controller.rb

Ruby

1class TopicsController < ApplicationController 2 3 def index 4 @topics = Topic.all 5 @newTopic = Topic.new 6 end 7 8 def show 9 @topic = Topic.find(params[:id]) 10 @newpost = Post.new(:topic_id => params[:id]) 11 @posts = Post.where(topic_id: params[:id]) 12 end 13 14 def create 15 @topic = Topic.new(params[:topic].permit(:title)) 16 @topic.save 17 redirect_to topics_index_path 18 end 19 20 def delete 21 @topic = Topic.find(params[:id]) 22 @topic.destroy 23 redirect_to topics_index_path 24 end 25 26end 27

config/routes.rb

Ruby

1Rails.application.routes.draw do 2 get "login" => "users#login_form" 3 post "login" => "users#login" 4 post "logout" => "users#logout" 5 post "users/:id/update" => "users#update" 6 get "users/:id/edit" => "users#edit" 7 post "users/create" => "users#create" 8 get "signup" => "users#new" 9 get "users/index" => "users#index" 10 get "users/:id" => "users#show" 11 get "topics/index" 12 get "topics/show/:id" => "topics#show", as: :topics_show 13 get "topics/show" 14 post "topics/create" => "topics#create" 15 delete "topics/delete/:id" => "topics#delete", as: :topic_delete 16 get "posts/:id" => "posts#show" 17 post "posts/create" => "post#create", as: :post_create 18 get "/" => "home#top" 19 get "about" => "home#about" 20end

app/models/post.rb

class Post < ApplicationRecord belongs_to :topic validates :name, {presence: true} validates :seats, {presence: true} validates :body, {presence: true} end

詳細

タイトルの通り投稿に失敗したとき直前の投稿内容を表示したくてpost_controller.rbにrenderを追加して、実際にわざと失敗の投稿(空の投稿)をしたら上のようなエラーになってしまいました。成功の投稿をしたときはちゃんと表示してくれます。
render追加前は@topic.titleに関するエラーはありませんでした。

いろいろ調べたのですが初心者のため全くどうすればいいかわかりません。よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ruby

routes.rb

post "posts/create" => "post#create", as: :post_create

ruby

1post "posts/create" => "posts#create", as: :post_create 2# ^^^^^^^^^^^^

ruby

post_controller

def create
@post = Post.new(
params[:post].permit(:topic_id, :name, :seats, :rating, :body))
if @post.save
redirect_to topics_show_path(params[:post]['topic_id'])
else
render("topics/show")
end
end

ruby

1# posts_controller 2# ^^^^^^^^^^^^^^^^ 3def create 4 @post = Post.new( 5 params[:post].permit(:topic_id, :name, :seats, :rating, :body)) 6 if @post.save 7 redirect_to topics_show_path(params[:post]['topic_id']) 8 else 9+ @topic = ... 10+ @newpost = ... 11+ @posts = ... 12 render("topics/show/#{@topic.id}") 13# ^^^^^^^^^^^^^^^^^^^^^^^^^^ 14 end 15end 16

投稿2018/12/20 00:14

編集2018/12/20 03:36
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

mimimi7_23

2018/12/20 02:27

ありがとうございます! postsに書き直し訂正したのですが、やっぱり@topic.titleにエラーが出てしまいます、、、、
mimimi7_23

2018/12/20 05:18

ありがとうございます! else @topic = Topic.find(params[:id]) @newpost = Post.new(:topic_id => params[:id]) @posts = Post.where(topic_id: params[:id]) render("topics/show/#{@topic.id}") end と書き換えたのですが、今度は ActiveRecord::RecordNotFound in PostsController#create Couldn't find Topic without an ID とエラーが出てしまいました…なんども聞いてしまってすみません。もしお暇な時がありましたら教えていただけるとうれしいです。
mimimi7_23

2018/12/20 05:19

posts_controllerにも書き直しました!
退会済みユーザー

退会済みユーザー

2018/12/20 05:33

createアクション実行時のparams[:id]はnilです。
mimimi7_23

2018/12/20 08:13

直前の投稿内容を表示するのは難しいということでしょうか? はじめたばかりで、無知ですみません。
Ighrs

2018/12/21 00:00

簡単ですよ、ただRESTful APIの基本的な考えを把握していないと全てが難しいと思います PostControllerにおける id は post.id なのでTopicが欲しいなら topic_id 側を使うだけです @topic = Topic.find(params[:post]['topic_id']) redirect_toは params[:post]['topic_id'] を使ってるのになぜrenderでは使わなかったのでしょうか? そのへんの違和感を認識できるまではコピペは控えたほうが良いです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問