2014-02-16 61 views
1

此代碼:軌道4 +設計 - User.find_by問題

def getUser(email_address) 
    User.find_by :email email_address 
end 

拋出一個語法錯誤:

requests_controller.rb:24: syntax error, unexpected tIDENTIFIER, expecting keyword_end 

其中該代碼(在相同的位置/功能實現,而不會改變任何東西)作品:

def getUser(email_address) 
    users = User.all 
    found_user = nil 
    users.each do |user| 
     if user.email == email_address 
      found_user = user 
      break 
     end 
    end 
    found_user 
end 

很明顯,第二個實施是可怕的。隨着用戶數量的增加,它將減速並停止。但我不明白爲什麼第一個 - 這應該是正確的做法 - 甚至不會編譯。

在調用方法之前加載類時會出現語法錯誤消息。不平衡的「if」/「end」沒有問題,因爲唯一改變的行是顯示的行。

我不明白爲什麼。我已經嘗試過很多變體,但沒有一個能夠工作。

據我所知,應該不需要發佈更多的代碼,但如果真的有人想要我,我會的。請注意,這不在設備控制器內,它只是我的其他應用程序控制器之一。但是,User.all工作,所以爲什麼User.find_by甚至沒有編譯?

page from the ActiveRecord docs建議它應該工作。負載tutorials and help pages such as this one表明確切的語法。 Devise必須爲ActiveRecord API做一些非常令人驚訝的事情來全面地解決這個問題。

任何人都知道發生了什麼事?

回答

1

事情是這樣的:

User.where(email: email_address).first 

關於錯誤:有參數之間沒有逗號。

+0

看起來不錯。謝謝你。我沒有嘗試過,因爲我設法讓find_by像下面那樣工作。 – Sez

0

明白了這個

def getUser(email_address) 
    User.find_by(:email => email_address) 
end 

工作要找到這一點,我通過在/ var/lib中/寶石grepped尋找find_by的例子,看到了這個:

/var/lib/gems/1.9.1/gems/devise-3.2.2/test/rails_app/app/mongoid/shim.rb 

def find_by_email(email) 
    find_by(:email => email) 
end 

example from the ActiveRecord docs應該如何工作我不知道,因爲我甚至無法編譯它。 :-(

+0

這與指南中的語法完全相同。第1.1.5節 - 'Client.find_by名字:'Lifo'' – sevenseacat

1

從導遊複製的語法時,你已經做了一個大的錯字 - 你已經變成一個散列(如:email: email_address)插入符號和一個字符串(:email email_address)注結腸定位

這聽起來像你不熟悉的Ruby 1.9哈希語法 - 打字email: email_address是打字:email => email_address快捷

0

@Sez,你缺少的東西,每個人都在這裏丟失 - 這是因爲你的語法是錯誤的沒有。其他人接受了它,你沒有傳遞你傳遞給單獨語句的哈希。你正在混合兩種類型的哈希語法,而沒有得到哈希值。

User.find_by :email => email_address#或

User.find_by email: email_address#此致:

User.find_by :email email_address # Subtle mistake, the error message also sucks

:電子郵件是一個符號,電子郵件:是在哈希的象徵語法。

:-)快樂的樂趣大家看着這個!