2014-02-16 66 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

:电子邮件是一个符号,电子邮件:是在哈希的象征语法。

:-)快乐的乐趣大家看着这个!