はじめに
フォーム内容を送信する際、バリデーションに引っ掛かったら
render
メソッドで新規投稿画面をレンダリングして
そこでエラーなり入力していた内容なりを表示すると学習した方が多いはず
しかし、render
メソッドが使えない時はどうしますか?
実は制作中のポートフォリオにGoogleMapAPIを使用しているのですが
render
でページをレンダリングするとなぜかMAPが表示しなくなる不具合が発生...
仕様を変えれば解決できる問題だったのですが、変えたくなかったので
render
を使わずに上記の動きを実現する方法を紹介します。
通常renderを使った場合
例としてtasks_controller.rb
に
新規投稿ページのアクションnew
と、
新規投稿内容を保存するアクションcreate
があるとします。
def create
@task = Task.new(task_params)
if @task.save
redirect_to @task, notice: 'タスクを保存しました。'
else
render :new
end
end
@task.save
が失敗しelse
以下のrender :new
が実行され、
新規投稿ページがレンダリングされます。
あとはもうご存知のとおり、viewのほうで@task.errors.full_messages
を活用してく感じですね。
renderを使わない場合
redirect_to
で再アクセスをするという形をとり、
エラー文や入力内容はアクション内でflash
に格納してしまいます。
def create
@task = Task.new(task_params)
if @task.save
redirect_to @task, notice: 'タスクを保存しました。'
else
flash[:error_msgs] = @task.errors.full_messages
flash[:tmp_body] = @task.body
redirect_to new_task_url
end
end
flash[:error_msgs]
にはエラー文を、
flash[:tmp_body]
には文章内容を、それぞれ格納しておきます。
あとはアクセス先のviewで、flashの値を活用してすればOKです。
以上!