2013-03-18 26 views
0

我有一个表单根据用户输入的设备名称以及其他一些数据创建新设备。我想在我的设备上运行查询以查看它们输入的名称是否已存在,以便它们不会创建具有重复名称的设备。无论我如何设置查询来执行搜索,该方法始终表明设备已经存在,即使它不存在。除了条件语句之外,代码将适当地创建设备。任何想法如何我可以解决这个问题?Rails - 将查询结果作为条件使用

在设备控制器的方法:

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 

回答

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 
+0

此解决方案有效,但我无法让我的应用程序重定向失败。它只是进入rails错误页面,指出'Name already exists'。有任何想法吗?你是否有效地通过在if语句中调用它来实现保存?在我目前的代码中,device.save!在if语句之前检查是否存储.s – 2013-03-19 13:09:46

+0

我更新了典型响应的答案,在这种情况下,呈现'new'动作并使用'flash'显示错误消息。 – 2013-03-19 13:13:13

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