renderとは
viewだけが返される処理
redirect_toとは
アクションを行う処理(viewも返される)
状況
- 投稿ができるフォームとコントローラーが存在している。
投稿フォーム(new.html.erb)
コントローラー(posts_controller.rb)
class PostsController < ApplicationController
def index
@posts = Post.all
end
def new
@post = Post.new
end
def create
@post = Post.new(post_params)
if @post.save
redirect_to posts_path
else
render :new
end
def post_params
params.require(:post).permit(:title, :content)
end
end
※post.rbにはvalidates :title, presence: true
を設定。(タイトルが空白の時は投稿ができない)
解説
titleが空じゃなかった場合
投稿することができるので、createアクションのif @post.save
はtrueとなり、redirect_to posts_path
が選ばれる。redirect_to
ではアクションが実行されるため、posts_path
に対応するindexアクションが実行される。
titleが空だった場合
投稿することはできないので、createアクションのif @post.save
はfalseとなり、render :new
が実行される。render
ではアクションが実行されずviewだけが返されるため、newアクションは実行されず、newアクションに対応したnew.html.erb(view)が返される。
renderとインスタンス変数
結論 renderの記述をしているアクションには、render先で記述しているアクションのインスタンス変数を持っていなければエラーが出るので注意すべき。
解説のtitleが空だった場合の例の場合ではcreateアクションの中にいて、viewだけがnew.html.erbを返している事になる。 **この場合のインスタンス変数はcreateにある@post
が使われている。**仮にcreateに@post
が存在しない場合に、render :new
を返すとどうなるだろうか?
本来viewで使われている@post
が存在しないため、new.html.erb
が表示できずエラーとなってしまう。