###実現したいこと
Shop
モデルとStaff
モデルが1対多の関係を持っているとします。
@staff=Staff.new
をsaveするとき、@staff.shop_id
に不正な値が入っていた場合、
@staff.errors.messages
のkeyに:shop_id
ではなく:shop
が指定されてしまいます。
formでエラーメッセージを表示させる都合上、
エラーメッセージのkeyには:shop_id
が指定されてほしいのですが、
良い方法はありますでしょうか。
よろしくお願いいたします。
以下詳細です。
###前提
ShopモデルとStaffモデルが以下のような関連を持っているとします。
ruby
1class Staff < ActiveRecord::Base 2 belongs_to :shop, required: true 3end 4 5class Shop < ActiveRecord::Base 6 has_many :staffs 7end
Staffの登録フォーム画面は以下のようにしています。
html
1<%= form_for @staff do |f|%> 2 <%= f.label :name, '名前' %><br /> 3 <%= f.text_field :name, required: true %><br /> 4 <%= f.label :shop_id, '店舗' %><br /> 5 <%= f.collection_select :shop_id, Shop.all, :id, :name %><br /> 6<% end %>
###発生している問題
このとき、ブラウザ上のformでソースコードの書き換えなどを行い、
現在DBに登録されていないshop_idで登録しようとしたとき、
以下のようなerrorsが返されます。
ruby
1[1] pry(#<StaffsController>)> @staff.errors.messages 2=> {:shop=>["入力してください"]}>
エラータグを、フォームの適切な場所(今回はf.collection_select
の部分)に出力させたい都合上、
最低でも、以下のようなerror messagesを返してほしいと思っています。
ruby
1[1] pry(#<StaffsController>)> @staff.errors.messages 2=> {:shop_id=>["入力してください"]}>
画面をrenderする前に、無理やりエラーメッセージを書き換える方法や、
独自のバリデーションを実装する方法などが思い浮かんでいるのですが、
何かベストプラクティスはありますでしょうか?
よろしくお願いいたします。
###その他の情報
ちなみにコントローラーは以下です。
ruby
1 2def new 3 @staff = Staff.new 4end 5 6def create 7 @staff = Staff.new(create_params) 8 if @staff.save 9 redirect_to staff_path, notice: "新規追加しました" 10 else 11 render 'new' 12 end 13end 14 15private 16 17def create_params 18 params.require(:staff).permit(:name,:shop_id) 19end
###補足情報
以下のバージョンを利用しています。
Rails 4.2.4
ruby 2.2.3
回答1件
あなたの回答
tips
プレビュー