Ruby on rails 4 将变量设置为等于函数和if语句

Ruby on rails 4 将变量设置为等于函数和if语句,ruby-on-rails-4,Ruby On Rails 4,我对Ruby语言和RubyonRails非常陌生,所以我不完全确定如何表达我的问题(可能会使用不正确的术语)。以下代码不起作用 @user = User.find_by email: params[:session][:email] if @user.authenticate(params[:session][:password]) # Signin @user else # Render failed Signin end 我得到一个错误,没有为nil:Nilc

我对Ruby语言和RubyonRails非常陌生,所以我不完全确定如何表达我的问题(可能会使用不正确的术语)。以下代码不起作用

@user = User.find_by email: params[:session][:email] 
if @user.authenticate(params[:session][:password]) 
     # Signin @user 
else 
    # Render failed Signin 
end 
我得到一个错误,没有为nil:Nilclass定义方法authenticate,但以下代码工作正常:

@user = User.find_by email: params[:session][:email] 
if @user && @user.authenticate(params[:session][:password]) 
    # Signin @user 
else 
    # Render failed Signin 
end 
我不明白为什么第一个代码块不工作。当我定义@user时,user.find_by方法是否没有运行并设置@user的值?还是只有在程序中调用时才设置变量值


编辑:删除不必要的括号。

您使用的
find_by
方法应导致NoMethodError异常(除非您在用户模型中定义了该方法)

可以对用户的任何属性使用dynamic finder方法(),如

User.find_by_email(params[:session][:email])

更新:我在发布答案时想到了Rails 3,Rails 4删除了动态查找程序,您使用的方法是完全有效的。

您使用的
find_by
方法应该会导致NoMethodError异常(除非您在用户模型中定义了该方法)

可以对用户的任何属性使用dynamic finder方法(),如

User.find_by_email(params[:session][:email])
更新:我在发布答案时想到了Rails 3,Rails 4删除了动态查找程序,您使用的方法非常有效。

首先,对
&&
操作符进行了很好的分解-它做什么和不做什么

在第一个街区的第二行:

if (@user.authenticate(params[:session][:password])) 
@user
-

if @user.authenticate(params[:session][:password]) 
正如哈桑所指出的,你也应该使用
find\u by\u email

首先,这是对
&&
操作符的一个很好的分解-它做什么和不做什么

在第一个街区的第二行:

if (@user.authenticate(params[:session][:password])) 
@user
-

if @user.authenticate(params[:session][:password]) 

正如哈桑所指出的,你也应该使用
find\u by\u email

以下是我认为第一个街区的问题:

在第一个块中,您搜索用户,如果未找到,将返回
nil
。然后,您尝试对
nil
进行身份验证,这就是为什么给您一个未定义为nil:class的


在第二个块上,通过在
if块中添加
@user
来解决问题。首先测试是否确实有检索到的用户,如果未找到该用户,则不会执行该块

以下是我认为第一个街区的问题:

在第一个块中,您搜索用户,如果未找到,将返回
nil
。然后,您尝试对
nil
进行身份验证,这就是为什么给您一个未定义为nil:class


在第二个块上,通过在
if块中添加
@user
来解决问题。首先测试是否确实有检索到的用户,如果未找到该用户,则不会执行该块

您使用的是什么版本的rails?您使用的是什么版本的rails?在发布此类答案之前,您最好了解rails@Jason使用的是什么版本的rails。在Rails 4中,有find_by(*args)方法在发布此类答案之前,您最好了解Rails@Jason使用的是哪个版本。在Rails 4中,有find_by(*args)方法谢谢,我已经删除了不必要的括号,但是从我读到的内容来看,Rails 4.0中find_by优先于find_by_email?啊,好吧,很抱歉,没有意识到你在使用Rails 4.0!谢谢,我已经删除了不必要的括号,但从我所读到的内容来看,Rails 4.0中的find_by优先于find_by_email?啊,好吧,很抱歉,我没有意识到你在使用Rails 4.0!非常感谢。这对我来说很有意义。我花了两个小时在谷歌上搜索这个问题,什么也找不到。我试着提升你的答案,但显然我还没有足够的声誉去做这件事。Np,如果你认为这是正确的答案,就把它标记出来。谢谢!这对我来说很有意义。我花了两个小时在谷歌上搜索这个问题,什么也找不到。我试着提升你的答案,但显然我还没有足够的声誉去做这件事。Np,如果你认为这是正确的答案,就把它标记为正确答案。