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