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

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

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

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

Q&A

解決済

1回答

4697閲覧

Railsで投稿確認画面を表示できない

Malas

総合スコア112

Ruby on Rails

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

0グッド

0クリップ

投稿2018/08/09 11:30

編集2018/08/09 13:10

前提・実現したいこと

Railsを使用してtwitterのクローンのようなサイトを作成しております。
そこでtitterでいうツイートをつぶやいた時に入力画面 => 確認画面 => 入力一覧画面のように作りたいのですが、
確認画面が表示されず、すぐに入力一覧画面が表示されてしまいます。
入力画面 => 確認画面 => 入力一覧画面と表示する方法を教えていただけますでしょうか?

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

入力画面(new.html.erb)=>確認画面(confirm.html.erb)=>入力一覧画面(index.html.erb)
という順番に表示したい。

該当のソースコード

posts_controller.rb

class PostsController < ApplicationController
def index
@posts = Post.all.order(created_at: :desc)
end

def show
@post = Post.find_by(id: params[:id])
end

def new
@post = Post.new
render :action => "new"
end

def create
@post = Post.new(content: params[:content])
if params[:back]
render("posts/new")
elsif @post.save
flash[:notice] = "投稿を作成しました"
redirect_to("/posts/index")
else
render("posts/new")
end
end

def edit
@post = Post.find_by(id: params[:id])
end

def update
@post = Post.find_by(id: params[:id])
@post.content = params[:content]
if @post.save
flash[:notice] = "投稿を編集しました"
redirect_to("/posts/index")
else
render("posts/edit")
end
end

def destroy
@post = Post.find_by(id: params[:id])
@post.destroy
flash[:notice] = "投稿を削除しました"
redirect_to("/posts/index")
end

def confirm
@post = post.new(params[:content])
if @post.invalid?
render :action => "confirm"
else
render :action => "new"
end
end
end

app/views/posts/new.html.erb

<div class="main posts-new"> <div class="container"> <h1 class="form-heading">投稿する</h1> <%= form_tag("/posts/create") do %> <div class="form"> <div class="form-body"> <% @post.errors.full_messages.each do |message| %> <div class="form-error"> <%= message %> </div> <% end %>
<textarea name="content"><%= @post.content%></textarea> <input type="submit" value="投稿を確認"> </div> </div> <% end %>
</div> </div>

app/views/posts/confirm.html.erb

<%= form_for @post, url: posts_path do |form| %>

<div class="field"> content: <%= @post.content %> <%= f.hidden_field :content %> </div> <div class="actions"> <%= f.submit '戻る', name: 'back'%> </div> <div class="actions"> <%= f.submit '投稿する!', name: 'post' %> </div> <% end %>

app/views/posts/index.html.erb

<div class="main posts-index"> <div class="container"> <% @posts.each do |post| %> <div class="posts-index-item"> <%= link_to(post.content, "/posts/#{post.id}") %> </div> <% end %> </div> </div>

config.routes.rb

Rails.application.routes.draw do

get "posts/index" => "posts#index"
get "posts/new" => "posts#new"
post "posts/confirm" => "posts#confirm"
get "posts/:id" => "posts#show"
post "posts/create" => "posts#create"
get "posts/:id/edit" => "posts#edit"

post "posts/:id/update" => "posts#update"
post "posts/:id/destroy" => "posts#destroy"

get "/" => "home#top"
get "about" => "home#about"

end

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

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

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

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

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

mingos

2018/08/09 12:44

前回の質問に修正した回答を載せましたが、進展しませんでしたか?
Malas

2018/08/09 12:46

はい、うまくはいきませんでした。解答していただいたのに申し訳ないです。
mingos

2018/08/09 12:49 編集

了解です。まず、コントローラにconfirmアクションを書いていますが、これは今のコードでは実行される事がないのは分かりますか? ルーティング(confir/routes.rb)にconfirmアクションを書いてませんよね。さらに、newのビューのフォームのPOST先がcreateになっているからです。まず、この点を理解しないといけません。
mingos

2018/08/09 12:52

今のコードの流れを保ったまま、確認画面を出すにはcreateアクションのほうに確認画面を表示する処理を書く必要があるのです。そして、confirmアクションは動かないので削除してしまっても良いです。でも、confirmのビューは残しておく必要があります。
Malas

2018/08/09 12:54

ありがとうございます。config/routes.rbにpost "posts/confirm" => "posts#confirm"と記入しましたが、これでは実行されないということでしょうか?
mingos

2018/08/09 12:56

ルーティングを書くだけでは足りなくて、コントローラのアクションはブラウザでアクセスしてはじめて実行されますよね?今のnewのビューだと、pots/createにしか行かないから、確認画面を表示したければ、createアクションの中でrender :confirmが必要という事です。
mingos

2018/08/09 12:57

confirmアクションを使いたい場合は、 (1)ルーティングを書く(済)。(2)newのフォームのPOST先にposts/confirmを指定するという事をすればOKです
Malas

2018/08/09 13:02

ありがとうございます。質問ばかりですみません。createアクションのどの部分にrender:confirmを加えたら良いか教えていただけないでしょうか?
mingos

2018/08/09 13:05

ちなみに、postに関するルーティング内容も質問に掲載してもらえますか? 設定次第でフォームタグの内容も変わってきますので。
Malas

2018/08/09 13:10

ルーティングも記載いたしました。
mingos

2018/08/09 13:22

新規投稿の部分だけ回答しました。動作確認したので動くはずです。
guest

回答1

0

ベストアンサー

とりあえず、新規投稿の部分だけですが回答します。
動作確認しているので、動かないという事はないはずです。

  • app/controllers/posts_controller.rb

ruby

1class PostsController < ApplicationController 2 3 def index 4 @posts = Post.all.order(created_at: :desc) 5 end 6 7 def new 8 @post = Post.new 9 end 10 11 def create 12 @post = Post.new(content: params[:content]) 13 14 if params[:back] 15 render :new 16 return 17 end 18 19 unless @post.valid? 20 render :new 21 return 22 end 23 24 if params[:send] 25 @post.save! 26 flash[:notice] = "投稿を作成しました" 27 redirect_to '/posts/index' 28 return 29 end 30 31 render :confirm 32 end 33 34end
  • app/views/posts/new.html.erb

ruby

1<div class="main posts-new"> 2 <div class="container"> 3 <h1 class="form-heading">投稿する</h1> 4 <%= form_tag('/posts/create') do %> 5 <div class="form"> 6 <div class="form-body"> 7 <% @post.errors.full_messages.each do |message| %> 8 <div class="form-error"> 9 <%= message %> 10 </div> 11 <% end %> 12 <%= text_area_tag :content, @post.content %> 13 <input type="submit" value="投稿を確認"> 14 </div> 15 </div> 16 <% end %> 17 </div> 18</div>
  • app/views/posts/confirm.html.erb

ruby

1<%= form_tag '/posts/create' do %> 2 <div class="field"> 3 content: <%= @post.content %> 4 <%= hidden_field_tag :content, @post.content %> 5 </div> 6 <div class="actions"> 7 <%= submit_tag '戻る', name: 'back'%> 8 </div> 9 <div class="actions"> 10 <%= submit_tag '投稿する!', name: 'send' %> 11 </div> 12<% end %>

投稿2018/08/09 13:22

mingos

総合スコア4025

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

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

Malas

2018/08/09 13:32

回答していただいた通りに実行しましたら、ちゃんと確認画面が表示されました。 本当にありがとうございます。 お手数おかけいたしました。
Malas

2018/08/09 13:41

すみません、入力画面を押して、確認画面に進んだ時にcontentの表示を投稿内容に変えたいのですが、 変え方を教えていただいてもよろしいでしょうか?
mingos

2018/08/09 13:45

いや、createアクションの先頭でこのようにcontentを受け取って設定しているので、 入力した内容になるはずなのですが。 @post = Post.new(content: params[:content])
Malas

2018/08/09 13:49

説明不足ですみません。 content:入力した内容 と表示されていたので、 投稿内容:入力した内容 という表記に変えたいということでした。こちらは自分でできました。 ありがとうございます。
mingos

2018/08/09 13:52

そういう事でしたか。 解決したようで良かったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問