从头开始验证:“未定义的方法`find_by_username`”

时间:2013-04-27 22:12:16

标签: ruby-on-rails basic-authentication filemaker

我正在尝试在我的应用程序中包含一个基于filemaker数据库的简单用户身份验证(使用ginjo-rfm gem)。在从Ryan Bates的Authentication from Scratch获得一些想法后,我写了一个自定义版本,但遇到了一些问题。

当我提交登录表单时,我会看到

  

用户的未定义方法`find_by_username':Class

find_by_username方法应该基于数据库中名为“username”的列,不是吗?

User.rb

class User < Rfm::Base
  include ActiveModel::SecurePassword
  include ActiveModel::MassAssignmentSecurity
  include ActiveModel::SecurePassword
  has_secure_password
  attr_accessible :username, :password

   config :layout => 'web__SupplierContacts'

  def self.authenticate(username, password)
    user = find_by_username(username)
    if user && user.password_hash == BCrypt::Engine.hash_secret(password, user.password_salt)
      user
    else
      nil
    end
  end  

end

sessions_controller.rb

class SessionsController < ApplicationController
 def new
 end

 def create
   user = User.authenticate(params[:username], params[:password])
      if user && user.authenticate(params[:password])
     session[:user_id] = user.id
     redirect_to root_url, notice: "Logged in!"
   else
     flash.now.alert = "Email or password is invalid"
     render "new"
   end
 end

 def destroy
   session[:user_id] = nil
   redirect_to root_url, notice: "Logged out!"
 end
end

我猜这是我的模型继承自Rfm :: Base的问题,但我不确定。 有什么想法吗?

思想: 有没有办法改写Class.find_by_column声明?我也无法做User.where(:username => "username usernamerson"(返回undefined method 'where' for User:Class)。

1 个答案:

答案 0 :(得分:1)

如果Rfm::Base未扩展ActiveRecord,那么您将无法使用findwhere等主动跟踪数据库查询方法 - 它们是ActiveRecord类的一部分,仅适用于从中继承的类。

如果要在扩展另一个类(在本例中为Rfm::Base)的类中包含数据库包装器方法,您可以查看DataMapper,它采用模块的形式(和因此可以包括在任何类中)。 (DataMapper可以用作Rails应用程序中ActiveRecord的替代品。)

此外,您已将ActiveModel::SecurePassword包括两次:

class User < Rfm::Base
  include ActiveModel::SecurePassword
  include ActiveModel::MassAssignmentSecurity
  include ActiveModel::SecurePassword

我会删除其中一个。