我可以将CanCan与User以外的型号一起使用吗?

时间:2014-07-24 21:05:35

标签: ruby-on-rails ruby authentication models cancan

我刚接触rails并使用api上的数据构建应用程序,我有两个我想用于用户的表 - studentseducators

我可以使用

在控制器中进行身份验证
private

def fetch_user_data(username, password)

    require 'URI'

    uri = URI('the url for the api')
    res = Net::HTTP.post_form(uri, 'username' => username, 'password' => password)
    xml = res.body
    doc = Nokogiri::Slop(xml)

    @status = doc.auth.status.content.to_s
    @username = doc.auth.username.content.to_s
    @token = doc.auth.token.content.to_s
    @person_id = doc.auth.person_pk.content.to_i
    @security_roles = doc.auth.security_roles.content.to_s.downcase
end

def assign_user

    if /faculty/ =~ @security_roles
        @user = Educator.find_by(person_id: @person_id)
    elsif /student/ =~ @security_roles
        @user = Student.find_by(person_id: @person_id)
    end
end

def authenticate_user(username, password)

    fetch_user_data(username, password)
    assign_user
    session[:user_id] = @user.id 
    redirect_to @user 
end

现在我知道它可能并不漂亮,但我正在学习。我在会话控制器中使用authenticate_user(),并且基于重定向,身份验证似乎很好。我对会话中的:user_id密钥有一个问题 - 是仅为会话创建的密钥还是尝试从用户表中提取值?知道这会有所帮助。我的猜测是它刚刚为会话创建,但我不知道。

好现在我的真正问题。我正在尝试使用cancan而且我在定义当前用户时遇到困难。

我想我可以将@current_user实例指向@user中指定的assign_user。这似乎不起作用。我尝试了几件事,但我被卡住了。也许我甚至不能这样做?更大的问题?我是否必须拥有用户模型才能使康康工作?我可以使用教育者和学生这两个模型,并在cancan中屏蔽用户参考吗?

我尝试了这个,但它没有用 - 有什么帮助吗?

def current_user
    @current_user ||= @user
end

编辑:想出一点。 方法在ApplicationHelper。已将current_user()移至ApplicationController。将语法更改为常规,但添加了条件。

def current_user
 if Student.where(id:session[:user_id]).count == 0
     @current_user ||= Educator.find(session[:user_id])
 else
     @current_user ||= Student.find(session[:user_id])
 end
end

这似乎解决了问题,并允许我将这两个表用作用户模型。

2 个答案:

答案 0 :(得分:1)

有几种方法可以定义current_user(如果你没有使用Devise),但是这个here非常标准:

class ApplicationController < ActionController::Base
  def current_user
    @current_user ||= User.find(session[:user_id])
  end
end

至于你关于会话的问题,你设置的方式,你设置的会话[:user_id]等于@ user.id(每个用户总是相同的)。

答案 1 :(得分:0)

轻微的一边考虑使用宝石CanCanCan听起来。 CanCan没有维护和一些设置替代CanCanCan。你不会改变任何代码。