【问题标题】:Rails 4 + Devise - User.find_by problemsRails 4 + 设计 - User.find_by 问题
【发布时间】:2014-02-16 14:30:53
【问题描述】:

这段代码:

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 暗示了确切的语法。设计必须对 ActiveRecord api 做一些非常令人惊讶的事情才能全面打破这种情况。

有人知道怎么回事吗?

【问题讨论】:

    标签: ruby-on-rails ruby select ruby-on-rails-4 devise


    【解决方案1】:

    类似这样的:

    User.where(email: email_address).first
    

    关于错误:参数之间没有逗号。

    【讨论】:

    • 看起来不错。谢谢你。我没有尝试过,因为我设法让 find_by 如下工作。
    【解决方案2】:

    从指南中复制语法时,您犯了一个大错字 - 您已将哈希(例如 email: email_address)转换为符号和字符串(:email email_address)。注意冒号的位置。

    听起来您对 Ruby 1.9 哈希语法不熟悉 - 输入 email: email_address 是输入 :email => email_address 的快捷方式。

    【讨论】:

      【解决方案3】:

      得到它的工作与此

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

      为了找到这个,我通过 /var/lib/gems 寻找 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 应该如何工作我不知道,因为我什至无法编译它。 :-(

      【讨论】:

      • 这与指南中的语法完全相同。第 1.1.5 节 - Client.find_by first_name: 'Lifo'
      【解决方案4】:

      @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

      :email 是一个符号,email: 是哈希中符号的语法。

      :-) 看到这里的每个人都开心快乐!

      【讨论】:

        猜你喜欢
        • 2014-01-16
        • 1970-01-01
        • 2011-06-29
        • 1970-01-01
        • 1970-01-01
        • 2011-10-07
        • 2013-01-12
        • 1970-01-01
        • 2013-07-03
        相关资源
        最近更新 更多