2011-07-07 77 views
0

我正在使用Devise和CanCan创建一个backbone.js前端和Rails 3.0.7后端。CanCan,Devise,Rails和Backbone.js,问题与更新

一旦我将load_and_authorize_resource添加到我的控制器,它不再允许我执行update并且我没有收到服务器的响应。如果我从控制器中删除load_and_authorize_resource,则一切正常。从我的控制台

信息:

开始在星期四七月PUT “/ POS/13” 为127.0.0.1 07 15点06分41秒-0700 2011

处理由PosController#更新为JSON

参数:{“confirmed”=> nil,“paid”=> nil,“needed”=> Thu,2011年6月30日,“amount”=> 16,“id”=>“13” “=> 1,”user_id“=> 1,”vendor_id“=> 5}

用户负载(0.1ms)SELECT”users“。* FROM”users“ WHERE “用户”, “ID”= 1 LIMIT 1

宝负荷(0.1毫秒)选择 “正”。* FROM “POS” WHERE “POS”。 “ID”= 13 LIMIT 1

作用负荷(0.1ms)SELECT“roles”* FROM“roles”INNER JOIN“roles_users”ON“roles”.id =“roles_users”.role_id WHERE“roles”。“name”='Admin'AND(“roles_users”.user_id = NULL)LIMIT 1

最后一个查询的结尾:"roles_users".user_id = NULL永远不会返回任何结果,并且不会让我更新资源。我能做些什么来解决这个问题?

其他信息:

PosController#update看起来是这样的:

def update 
    @po = Po.find(params[:id]) 
    @po.update_attributes! params 
    respond_with @po 
end 

我用角色来管理的能力。我ability.rb样子:

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new # guest user (not logged in) 
    if user.role? :admin 
     can :manage, :all 
    end 
    end 
end 

User.rb包含:

def role?(role) 
    return !!self.roles.find_by_name(role.to_s.camelize) 
end 

角色从UsersHaveAndBelongToManyRoles移民获得:

class UsersHaveAndBelongToManyRoles < ActiveRecord::Migration 
    def self.up 
    create_table :roles_users, :id => false do |t| 
    t.references :role, :user 
    end 
    end 

    def self.down 
    drop_table :roles_users 
    end 
end 

我现在只有一个用户,并有给这个用户的角色管理员。我已经能够通过使用条件来检查这一点,除非current_user.role? :admin,否则不会在PosController#index中传递任何@pos。

+0

通过“我没有得到服务器的回应”,它只是处理页面,从不回应?或者你的意思是它没有内容即时返回?如果是这样,页面的状态如何?它是重定向吗?如果是这样,到哪里? – ryanb

+0

@ryanb它将PosController#更新为JSON,并且我得到了一个没有内容的200响应。数据库从不更新。由于这是全部JSON,它不会重定向。 – joshvermaire

回答

3

这可能是Devise在AJAX请求上失去验证的问题,请查看this issue以了解详细信息。

看起来像传递给Ability的current_user为零。尝试删除load_and_authorize_resource并确保current_user在操作中正确设置。

如果这不是问题,请首先确保user.role? :admin对该用户返回true。接下来,请尝试Ability.new(user).can?(:update, Po.find(...)),详情请参阅Debugging Abilities

我不明白的是为什么它返回一个空的JSON响应。 CanCan从不直接处理响应,只是在授权失败时引发异常。您是否在您的ApplicationController中使用rescue_from捕获这个问题?如果是这样,请尝试删除它以确保授权实际上失败,并且没有其他任何操作正在处理JSON响应。

+0

谢谢@ryanb。设计失去了认证。我想我应该在之前注意到这一点。它似乎也是'.role?'不是它应该的。无论如何,更新jquery-rails是修复。 – joshvermaire