以下の質問と同様の質問なのですが、正しい解答が付いていなく、改めて質問させて頂きます。
https://teratail.com/questions/18729
ドットインストールのRuby on Railsのレッスンで作成したサンプルアプリケーションでのエラーメッセージの表示についてです。
###サンプルアプリケーションの内容
タスク管理アプリ
-プロジェクト > タスク(親のプロジェクトに対してタスクは複数生成可能)
というシンプルなものです。
###実現したい事
タスクを生成する際に
-①バリデーションをかける(これは実現済み)
-②エラーの場合はエラーメッセージをViewに表示する
です。こちらもシンプルです。
・・・が②がどうにも上手く行きません。
###知りたい事
この場合のバリデーション失敗のエラー情報は一体どこに格納されているのか?
※通常、formでバリデーションに失敗するとモデルオブジェクトのerrorsにエラーの内容が含まれているはず。
###以下関係する(と思われる)コードと実際のエラー画面
Viewのtaskを生成するフォームのコードは以下
show.html.erb
<%= form_for [@project, @project.tasks.build] do |f| %> <p> <%= f.text_field :title %> <!-- <%= render 'shared/error_messages', object: f.object %> ※話を分かりやすくする為にパーシャルは一旦利用しないようにしました--> <% if @task.errors.any? %> <%= @task.errors.messages[:title][0] %> <% end %> </p> <p> <%= f.submit %> </p> <% end %>
該当Controllerの該当アクションは以下
def create @project = Project.find(params[:project_id]) if @task = @project.tasks.create(task_params) redirect_to project_path(@project.id) else render "projects/show" end end
taskに対するバリデーションは以下(バリデーション自体は問題なく動作しています。)
class Task < ActiveRecord::Base belongs_to :project validates :title, presence: {message:"タイトルは必須項目です。入力してください。"}, length: {minimum: 3, message:"タイトルは3文字以上で入力してください。"} scope :unfinished, -> {where(done: false)} end
該当部分のルーティングの設定は以下
resources :projects do resources :tasks, only: [:create, :destroy] end
show.html.erbに遷移しようとした際に発生するエラー画面
エラーになる理由はなんとなく分かっています。@taskがnilというか空だからだと理解しています。(それもそのはず、タスクの生成に成功した後に@taskにその内容が入ると理解しています。)
また、エラー自体は以下いずれかで回避出来ます。
①@taskというインスタンス変数がviewに紐づくアクション内で定義されていないので定義してあげる。
projects_controller.rb
def show @task = Task.new end
②viewのコードに以下を追加。
show.html.erb
<% if @task %> <% if @task.errors.any? %> <%= @task.errors.messages[:title][0] %> <% end %> <% end %>
ただ、これらはエラーメッセージを表示させるものではなく、あくまでエラーが発生しなくなるだけです。
少し難しいの(と思っているのは)今回は、Projectsの下にtaskがある事です。
なので、createアクションやフォームの中に以下のような一見まどろっこしい書き方があるのだと理解しています。
createアクション
@task = @project.tasks.create(task_params)
viewのform
<%= form_for [@project, @project.tasks.build] do |f| %>
最初から@taskで良いじゃんと思ってしまいます。
でも、それではダメ(な何かがある。)
という事はエラーメッセージも@taskではないところに格納されているのだろうと推察しています。
ただ、以下のように@project.tasksに変更してもダメでした。最初と同じエラーになります。
試したviewのform
<% if @project.tasks.errors.any? %> <%= @project.tasks.messages[:title][0] %> <% end %>
この場合のtaskのバリデーションに失敗したエラー情報は一体どこにあるのでしょうか・・・・??
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。