Я использую 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
.