2013-03-18 48 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