別のコントローラをrenderする方法
createアクションで投稿の保存に失敗した場合(バリデーションに失敗)、再度フォームを表示しないといけない。
これまではrender :new
でtweets/new.html.erbで表示されていたが、フォームをtweetsフォルダ以外のviewに移した場合、今回はhome/top/html.erbに移動。これを表示するには`render 'home/topと変更する。
def create @tweet = current_user.tweets.build(tweet_params) if @tweet.save redirect_to @tweet else render :new #=>これを 'home/top'に変更する。 end
home/top.html.erbに<%= render @tweets %>などで
@tweetsなどインスタンス変数を用いている場合はこのままではエラーが起きてしまう。
renderはredirect_toと異なりアクションを経由せず、そのままビューを出力するので、ビューで使う変数は、renderの前に
そのアクション`で定義しないといけない。
ここではhome/top.html.erbで使用している@tweetsをcreateアクションで定義しておく必要がある。
def create @tweet = current_user.tweets.build(tweet_params) if @tweet.save redirect_to @tweet else @tweets = Tweet.all.order(created_at: desc) render 'home/top' #保存が失敗した場合は@tweetsが必要 end