ihatov08 blog

プログラミング初心者だけどRailsとSwiftマスターします

別のコントローラを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