0

私の見解では、次のコードがあります。

<%= 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
4

1 に答える 1

1

ユーザーを選択しないときに例外が発生する理由は、この行です

unless @parcel.user.mobilenumber.blank?

user_idが設定されていない@parcel.userため、nil例外が発生します。@parcel.saveブロック内に移動することをお勧めします。

def create
  @parcel = Parcel.new(params[:parcel])
  @parcel.localip = request.env['REMOTE_ADDR']
  @parcel.received_by = @parcel.received_by.upcase

  respond_to do |format|
    if @parcel.save
      unless @parcel.user.mobilenumber.blank?
        UserMailer.parcel_notification(@parcel).deliver
      end

      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
于 2013-02-10T12:50:31.617 に答える