Devise & CanCan – Problemas con CanCan 2.0 API

Me gustaría tener atributos adicionales para mi modelo de usuario y no quiero crear un modelo de perfil separado. Estoy tratando de actualizar los campos personalizados con standart «actualizar» desde el conjunto de acciones REST:

class UsersController < ApplicationController before_filter :authenticate_user! # ... def update @user = User.find(params[:id]) authorize! :update, @user respond_to do |format| if @user.update_attributes(params[:user]) format.html { redirect_to @user, notice: 'User was successfully updated.' } format.json { head :ok } else format.html { render action: "edit" } format.json { render json: @user.errors, status: :unprocessable_entity } end end end end 

Y todo va bien, excepto el hecho de que current_user puede actualizar el perfil de cualquier usuario. Parece que no puedo restringir ninguna acción del usuario. He intentado:

 can :update, User, :id => user.id 

y

 cannot :update, User # at all 

sin suerte Usando Devise 1.5.0 y CanCan 2.0.0.alpha

Aquí está mi habilidad.

 class Ability include CanCan::Ability def initialize(user) user ||= User.new(:role => nil) # guest user (not logged in) can :access, :all if user.admin? can :manage, :all else can :read, Review if user.customer? can :update, User, :id => user.id can [:create, :update, :destroy], Review, :user_id => user.id end end end end 

El código me parece bien. ¿Qué sucede si intenta simplificar primero la segunda condición y eliminar la condición del cliente? Y tal vez sacar “can: access,: all

Algo como:

 class Ability include CanCan::Ability def initialize(user) user ||= User.new(:role => nil) # guest user (not logged in) if user.admin? can :access, :all else can :read, :all can :update, :users, :id => user.id can [:create, :update, :destroy], :reviews, :user_id => user.id end end end 

¿Su restricción funciona para Revisiones (ese usuario solo puede editar sus propias revisiones)? Tengo un archivo de habilidad similar pero siempre trabajo con un modelo de perfil separado …