【问题标题】:CanCan user parameter always nil only ajax requestCanCan 用户参数始终为零,仅 ajax 请求
【发布时间】:2013-02-19 01:28:20
【问题描述】:

我在我的 Rails 应用中使用 Cancan + Devise:

问题发生在我尝试更新评论记录时,我猜初始化方法的用户参数总是会出现nil,即使我已登录:

能力.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

Better_errors

最后它引发了这个错误。

每个人都面临这个问题? 谁能帮帮我?

导轨 3.2.8 设计 2.1.0 康康 1.6.9 红宝石 1.9.3p385

编辑 1

CommentsController.rb

 class CommentsController < ApplicationController

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

   layout "admin"

编辑 2

大家好,CanCan 在控制器收到 ajax 请求时运行良好。

评论.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"
 });

config/routes.rb

  resources :comments do
    member do
      put 'approve'
      put 'moderate'
      put 'disapprove'
    end
  end

【问题讨论】:

  • 请考虑将您的代码作为文本发布。如果有人想尝试一下,将其作为图片发布并不是很有帮助。

标签: ruby-on-rails ruby cancan


【解决方案1】:

不是user 是零,而是user.role

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

编辑

Cancan 在控制器上使用current_user 方法。如果该方法返回 nil,那么您的能力文件中的 user 将为 nil。

确保设计 before_filter 在您的 Cancan 过滤器之前运行(例如调用 load_and_authorize_resource)。如果您的用户在 Cancan 开始尝试授权之前尚未进行身份验证,则您的用户将为 nil。

【讨论】:

  • user ||= User.new # guest user这一行之前,变量user为nil,之后它只是一个新的User实例..因为我已经登录,所以用户必须是我的记录不是吗?
  • 不。 NilClass 的未定义方法名称,表示用户为 nil
  • 第 10 行... name 方法是在角色而不是用户上调用的。
  • 如果用户为 nil,则错误将是“nil::NilClass 的未定义方法 'role'”。
  • @NandoSousa 您使用 Devise 获得的 before_filter 需要在 Cancan before_filters 之前运行,否则 current_user 将返回 nil。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-06
  • 2023-03-23
  • 2015-03-25
  • 2014-01-11
  • 2022-01-11
相关资源
最近更新 更多