私の見解では、次のコードがあります。
<%= f.select :user_id, user_all_select_options, :include_blank => '--Select a name-----' %>
上部にユーザーのリストが表示されます--Select a name-----
。ユーザーがリストから名前を選択せずに選択した--Select a name-----
ままにすると、user_idが空白であるため、エラーが発生します。
参考までに、ヘルパーメソッドコードは次のようになります。
def user_all_select_options
User.all.map{ |user| [user.name, user.id] }
end
私のモデルは次のとおりです。
class Parcel < ActiveRecord::Base
attr_accessible :parcel, :received_at, :received_by, :chilled, :courier, :location, :passed_to, :user_id, :user, :content, :localip
validates :user_id, :presence => true
belongs_to :user
end
何らかの理由で検証が実行されていないように見えますが、ドロップダウンからユーザーを選択し、他のフィールド入力の検証を追加すると、アプリケーションは、どのフィールドが誤って空であるかを示すメッセージをユーザーに正しく表示します。
興味深いことに、選択ドロップダウンを--Select a name-----
そのままにして追加の検証を続けると、例外がスローされます。欠落しているフィールドの入力を求めるプロンプトは表示されず、エラーが発生するだけです。
エラー中のレコードは次のとおりです(このレコードは、ロケーションフィールドで検証プレゼンスチェックを行ったときのものです。
{"utf8"=>"✓", "authenticity_token"=>"wM4KPtoswp3xdv8uU4UasdadNsZi9yFZmk=", "parcel"=>{"user_id"=>"", "received_by"=>"dan", "content"=>"", "chilled"=>"0", "courier"=>"", "location"=>"", "passed_to"=>"", "received_at(3i)"=>"9", "received_at(2i)"=>"2", "received_at(1i)"=>"2013", "received_at(4i)"=>"22", "received_at(5i)"=>"59"}, "commit"=>"Receive this Parcel", "action"=>"create", "controller"=>"parcels"}
どこから始めればいいですか?表示されるエラーは、ユーザーに対してチェックしない限り、コントローラーが実行する場合です。
パーセルコントローラの作成メソッドは次のようになります。
def create
@parcel = Parcel.new(params[:parcel])
@parcel.localip = request.env['REMOTE_ADDR']
@parcel.received_by = @parcel.received_by.upcase
unless @parcel.user.mobilenumber.blank?
UserMailer.parcel_notification(@parcel).deliver
end
respond_to do |format|
if @parcel.save
format.html { redirect_to @parcel, notice: 'Parcel was successfully created.' }
format.json { render json: @parcel, status: :created, location: @parcel }
else
format.html { render action: "new" }
format.json { render json: @parcel.errors, status: :unprocessable_entity }
end
end
end