CanCan, Devise, Rails и Backbone.js, проблема с: обновлением - PullRequest
0 голосов
/ 08 июля 2011

Я использую Devise и CanCan для создания внешнего интерфейса backbone.js и Rails 3.0.7 для внутреннего.

Как только я добавляю load_and_authorize_resource к своему контроллеру, он больше не позволяет мне выполнять update, и я не получаю ответ от сервера. Если я удаляю load_and_authorize_resource из моего контроллера, все работает хорошо.

Информация с моей консоли:

Запущен PUT "/ pos / 13" для 127.0.0.1 в четверг 07 июля 15:06:41 -0700 2011

Обработка в PosController # обновляется как JSON

Параметры: {"подтверждено" => ноль, "оплачено" => ноль, "необходимо" => чт, 30 июня 2011 года, "сумма" => 16, "идентификатор" => "13", "утверждено" => 1, "user_id" => 1, "vendor_id" => 5}

Пользовательская нагрузка (0,1 мс) ВЫБЕРИТЕ "users". * FROM "users" WHERE "users". "Id" = 1 LIMIT 1

Po Load (0,1 мс) ВЫБЕРИТЕ "pos". * ИЗ "pos" ГДЕ "pos". "Id" = 13 LIMIT 1

Загрузка ролей (0,1 мс) ВЫБРАТЬ «Роли". * ИЗ "Роли" INNER JOIN "role_users" ON "role" .id = "role_users" .role_id WHERE "role". "Name" = 'Admin' AND ( "role_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

Я использую роли для управления способностями. Моя способность .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

В настоящее время у меня есть только один пользователь, и я назначил ему роль администратора. Мне удалось дважды проверить это, используя условное выражение, чтобы не пропустить ни одного @pos в PosController#index, если current_user.role? :admin.

1 Ответ

3 голосов
/ 08 июля 2011

Это может быть проблемой с потерей аутентификации Devise при запросах AJAX. Подробности смотрите в этой проблеме .

Похоже, что current_user, который передается Ability, равен нулю.Попробуйте удалить load_and_authorize_resource и убедитесь, что current_user правильно задан в действии.

Если это не проблема, сначала убедитесь, что user.role? :admin возвращает true для этого пользователя.Затем попробуйте Ability.new(user).can?(:update, Po.find(...)), см. Способности отладки для получения подробной информации.

Что я не понимаю, так это почему он возвращает пустой ответ JSON.CanCan никогда не обрабатывает ответ напрямую, он просто вызывает исключение при неудачной авторизации.Вы ловите это с помощью rescue_from в вашем ApplicationController?Если это так, попробуйте удалить его, чтобы убедиться, что авторизация действительно не удалась, и ничто другое не обрабатывает ответ JSON.

...