0

ユーザーが入力したデバイスの名前やその他のデータに基づいて、新しいデバイスを作成するフォームがあります。デバイスでクエリを実行して、入力した名前がすでに存在するかどうかを確認し、名前が重複するデバイスを作成しないようにします。検索を実行するためのクエリをどのように設定しても、メソッドは、デバイスが存在しない場合でも、デバイスがすでに存在していることを常に示します。条件文がない場合、コードはデバイスを適切に作成します。これを解決する方法はありますか?

デバイスコントローラのメソッド:

def create
 if Device.where('name' => params[:name])
  respond_to do |format|
   format.html { redirect_to :back, notice: 'Cannot create device. It already exists.' }
  end
  else

 #Code that creates device

 #respond_to code

 end
end
4

2 に答える 2

1

常に合格する理由は、空の配列を返し、if []trueを返すためです。その名前のユーザーが存在するかどうかを確認するには、次を使用できます。

Device.where(:name => params[:name]).exists?

しかし、あなたはそのようにそれをするべきではありません。検証を使用する必要があります。

validates :name, :uniqueness => true

検証とその使用方法の詳細については、ガイドを確認してください:http: //guides.rubyonrails.org/active_record_validations_callbacks.html

より詳細な説明については、2番目の回答も参照してください。このようなものは、この本でうまく説明されています:http: //ruby.railstutorial.org/chapters/modeling-users#sec-presence_validation

于 2013-03-18T20:17:20.050 に答える
1

データの重複を防ぐために、モデルレベルの検証を使用する必要があります。

class Device < ActiveRecord::Base
  validates_uniqueness_of :name, :message => 'already exists'

...
end

そうすれば、コントローラーでメソッドに基づいて決定を下すことができますsave

@device = params[:device]
respond_to do |format|
  if @device.save
    format.html # successful save
   else
    format.html { render action: 'new' }
   end
end
于 2013-03-18T20:17:47.203 に答える