Ruby on Railsの勉強〜コントローラとビューで検証エラーに対応する〜
モデルの検証が意図通りに動くことを確認できたがアプリの全体的な要件としては、モデルが検証に引っかかった時にユーザーに原因をわかりやすく表示して再入力を促す必要がある。
この時点では検証を使わず必ず登録は成功すると期待していたので、TaskController(app/controllers/task_controller.rb)のcreateアクションは、save!メソッドを使って次のように実装していました。
def create task = Task.new(task_params) task.save! redirect_to tasks_url, notice: "タスク「#{task.name}」を登録しました。" end
これを次のように変更
def create @task = Task.new(task_params) --③ if @task.save --① redirect_to @task, notice: "タスク「#{@task.name}」を登録しました。" else render :new --② end end
ここでの変更点は3つ。
1つ目、登録のために用いるメソッドの変更(①)。前回でname属性が入っていないといけないという検証を追加したので
ユーザーの入力次第では失敗するようになった。
そこでsave!ではなくてsaveを使えるようにして、その戻り値によって制御するようにしている。
2つ目、検証エラーの時の処理の追加(②)検証結果がfalseだった時は、render :newによって登録用のフォーム画面を再び表示してユーザーに再入力を促している。
3つ目、Taskオブジェクトを@taskと言うインスタンス変数に代入するようにしている。これは検証エラーがあってもう一度新規登録画面を表示する際にビューに検証を行った現物のTaskオブジェクトを渡す必要があるから。@taskをビューに渡すことによって次の2つの効果が生まれる。
1・Taskオブジェクトには直前にユーザーがフォーム送信したデータが入っているため前回操作したままの値をフォーム内に引き継いで表示できる。これをやらないと検証エラーが出るたびに全てのデータを再入力しないといけなくなるのでユーザーがイライラするはず。
2・Taskオブジェクトの抱える検証エラーの内容をユーザーに対して表示することができる。
この時点では名称がない場合にはタスク登録できない状態だけど、詳しい説明のところに書いたものは消えずに再入力できる状態。
しかし、まだビューを触っていないのでユーザーには何が原因で登録できているかわからないので次回でビューを触り、的確なエラーメッセージを表示させる。