我正在尝试在我的应用程序中包含一个基于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
)。
答案 0 :(得分:1)
如果Rfm::Base
未扩展ActiveRecord
,那么您将无法使用find
,where
等主动跟踪数据库查询方法 - 它们是ActiveRecord
类的一部分,仅适用于从中继承的类。
如果要在扩展另一个类(在本例中为Rfm::Base
)的类中包含数据库包装器方法,您可以查看DataMapper,它采用模块的形式(和因此可以包括在任何类中)。 (DataMapper可以用作Rails应用程序中ActiveRecord的替代品。)
此外,您已将ActiveModel::SecurePassword
包括两次:
class User < Rfm::Base
include ActiveModel::SecurePassword
include ActiveModel::MassAssignmentSecurity
include ActiveModel::SecurePassword
我会删除其中一个。