2011-07-07 24 views
0

私はDeviseとCanCanを使ってbackbone.jsフロントエンドとRails 3.0.7バックエンドを作成しています。CanCan、Devise、Rails、Backbone.js、with with issue:update

コントローラにload_and_authorize_resourceを追加するとすぐにupdateを実行できなくなり、サーバーからの応答が得られなくなります。コントローラからload_and_authorize_resourceを削除すると、すべて正常に動作します。

私のコンソールからの情報:

はJSONとしてPosController番号の更新によって処理木7月7日に127.0.0.1のために15時06分41秒-0700 2011

をPUT "/ POS/13" を開始しました

パラメータ:{"確認済み" =>なし、 "支払済み" =>なし、 "必要" => 2011年6月30日、 "金額" => 16、 "id" => "13"、 "承認済み"=> 1、" user_id "=> 1、" vendor_id "=> 5}

ユーザ負荷(0.1ms)SELECT" users "。* FROM" users "ここで、 "ユーザ"、 "ID" = 1 LIMIT 1

ポーロード(0.1ms)を選択し、 "POS"。* "POS" FROM "POS"。 "ID" = 13 LIMIT 1

役割ロード(0.1ms)SELECT "roles"。* FROM "roles" INNER JOIN "roles_users" ON "roles" .id = "roles_users" .role_id "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 

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 

私は現在、唯一のユーザーを持っている、と持っている私のability.rbは次のようになりますこのユーザーにロールの管理者を与えます。私は、current_user.role? :adminを除いて、PosController#indexに何らかの@posを渡さないために条件を使ってこれを再確認することができました。

+0

「サーバーからの応答がありません」というのは、ページを処理しているだけで、応答しないということですか?それとも、内容がなくても即座に返ってくるということですか?もしそうなら、ページの状態はどうですか?それはリダイレクトですか?もしそうなら、どこに? – ryanb

+0

@ryanb PosController#updateへのPUTをJSONとして実行し、内容のない200応答を取得します。データベースは決して更新されません。これはすべてJSONなので、リダイレクトされません。 – joshvermaire

答えて

3

これは、DevitsがAJAXリクエストで認証を失うことで問題になる可能性があります。詳しくはthis issueをご覧ください。

能力に渡される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とこれをキャッチしていますか?もしそうなら、それを削除して、Authorizationが実際には失敗していることを確認し、JSONレスポンスを処理するものは何もありません。

+0

ありがとう@ryanb。 Deviseは認証を失っていました。私は以前に気付いたはずだったと思います。また、 '.role?'はそれほど行動していなかったようだ。どんなものであれ、jquery-railsの更新は修正されました。 – joshvermaire