我试图在我的应用程序中包含一个简单的用户身份验证,基于一个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
我会删掉其中一个