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

另请参阅第二个答案以获得更详细的解释,这本书很好地解释了这样的内容: 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 回答