CanCan用户参数始终只有ajax请求

Nan*_*usa 0 ruby ruby-on-rails cancan

我在我的rails应用程序中使用Cancan + Devise:

当我尝试更新评论记录时,问题就出现了,我想初始化方法的用户参数总是即将到来,nil即使我已记录:

Ability.rb

class Ability
  include CanCan::Ability


  def initialize(user)
    user ||= User.new # guest user

    unless user.nil?
      if user.role.name == "admin"
        can :manage, :all
      elsif user.role.name == "atendimento"
        can :manage, Comment
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

Better_errors 更好的错误

最后它引发了这个错误.

在此输入图像描述

每个人都面临这个问题?有人可以帮帮我吗?

Rails 3.2.8设计2.1.0 CanCan 1.6.9 Ruby 1.9.3p385

编辑1

CommentsController.rb

 class CommentsController < ApplicationController

   authorize_resource :only => [:index, :show,:new,:edit, :create,:update,:destroy,  :approve, :moderate, :disapprove]

   layout "admin"
Run Code Online (Sandbox Code Playgroud)

编辑2

嘿伙计们,CanCan在控制器收到ajax请求时工作得很好.

Comments.js

 var request = $.ajax({
   url: url_to_request,
   type: "PUT",
   data: {id : id_to_send, answer : answer_to_send, question : question_to_send },
   dataType: "json"
 });
Run Code Online (Sandbox Code Playgroud)

配置/ routes.rb中

  resources :comments do
    member do
      put 'approve'
      put 'moderate'
      put 'disapprove'
    end
  end
Run Code Online (Sandbox Code Playgroud)

小智 5

它不是user零,它是user.role.

您可以使用user.role.try(:name)或确保该role方法始终返回响应的对象name.

编辑

Cancan current_user在控制器上使用该方法.如果该方法返回nil,则用户将在您的Ability文件中为nil.

确保Devise before_filter在过滤器之前运行在Cancan之前(如调用load_and_authorize_resource).如果您的用户在Cancan开始尝试授权之前未经过身份验证,则您的用户将为零.