从头开始身份验证:"undefined method `find_by_username`"



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

当我提交登录表单时,显示的是

未定义的方法' find_by_username'为用户:类

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)。

如果Rfm::Base不扩展ActiveRecord,那么您将无法使用activerecord db查询方法,如find, where等-它们是ActiveRecord类的一部分,仅适用于从它继承的类。

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

另外,您还包含了两次ActiveModel::SecurePassword:

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

我会删掉其中一个

最新更新