将devise用于除用户之外的模型

时间:2014-05-16 02:48:32

标签: ruby-on-rails ruby devise

所以,我对rails和设计有些新意,所以如果这是一个基本问题我会提前道歉。我在任何地方都找不到任何关于此的信息,我彻底搜查了。这也让我想知道Devise是否适合这个,但是我们走了:

我有一个应用程序,其中设计用户身份验证工作得很好,我得到它,正确实现它并且它工作。

在我的应用中,用户可以属于某个群组,并且该群组的密码是用户必须输入才能“加入”群组的。

我成功将devise :database_authenticatable添加到我的模型中,当我创建它时,会创建一个加密密码。

我的问题是,我无法对此进行身份验证!我有一个表单,用户加入组,搜索他们的组,然后输入密码。

这就是我的尝试:

def join
    @home = Home.find_for_authentication(params[:_id]) # method i found that devise uses

    if @home.valid_password?(params[:password]);
      render :json => {success: true}
    else
      render :json => {success: false, message: "Invalid password"}
    end

end

这给了我错误:can't dup NilClass 在这一行:@home = Home.find_for_authentication(params[:_id])

有什么问题?

1 个答案:

答案 0 :(得分:1)

问题出在这里:

Home.find_for_authentication(params[:_id])

我之前从未使用database_authenticatable(会研究它,谢谢!),所以我checked the Devise为您提供文档


他们推荐的方法:

User.find(1).valid_password?('password123')         # returns true/false

-

<强>对象吗

您使用的方法has a doc

  

根据给定的条件(即通过登录表单)查找第一条记录。   始终在身份验证过程中调用此方法,但它   也可以包裹。例如,数据库可验证   提供一个包含呼叫的find_for_database_authentication   这种方法。这允许您自定义两个数据库   通过自定义可验证或整个验证堆栈   find_for_authentication.

     

覆盖以添加自定义条件,创建连接或使用a   namedscope在验证时过滤记录

实际代码如下所示:

def self.find_for_authentication(tainted_conditions)
  find_first_by_auth_conditions(tainted_conditions)
end

看看这段代码,在我看来,通过一个单一的参数并不会削减它。您需要一个对象(因此User.find([id])),或者您需要向该方法发送一系列参数

然后我找到了this

class User
  def self.authenticate(username, password)
    user = User.find_for_authentication(:username => username)
    user.valid_password?(password) ? user : nil
  end
end

我建议这样做:

@home = Home.find_for_authentication(id: params[:_id])
...