2011-07-07 116 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