0

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

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

用户:类的未定义方法“find_by_username”

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

用户.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

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

4

1 回答 1

1

如果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

我会删除其中一个。

于 2013-04-29T13:05:43.120 回答