Rails - 使用查询结果作为条件

时间:2013-03-18 20:14:09

标签: ruby-on-rails ruby-on-rails-3

我有一个表单,可以根据用户输入的设备名称以及其他一些数据创建新设备。我想在我的设备上运行查询以查看他们输入的名称是否已存在,以便他们可能无法创建具有重复名称的设备。无论我如何设置查询来进行搜索,该方法总是声明设备已经存在,即使它不存在。在没有条件语句的情况下,代码会适当地创建设备。有什么想法我可以解决这个问题吗?

设备控制器中的方法:

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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