Pergunta

Estou tentando adicionar autorização de dispositivo ao meu aplicativo Rails 3. Está tudo indo bem, exceto que eu também estou tentando seguir este tutorial para definir dinamicamente attr_accessible pararole_ids apenas para usuários admin (eu não quero que usuários regulares mudem suas funções, mas um admin deve ser capaz de fazer isso) ... o problema é, a abordagem do tutorial railscast assume que eu tenho acesso para alterar o comportamento do controlador quando na verdade o planejo élidar com tudo isso sob o capô.

Por favor, ajude

Foi útil?

Solução

Você pode criar subclasses dos controladores Devise, basta gerar as visualizações e movê-las para o local correto.Verifique "Configurando visualizações" e "Configurando controladores" no leia-me do Devise.

Acabei adicionando role_ids a attr_accessible, em seguida, criando uma subclasse de RegistrationsController e adicionando um before_filter para remover esse parâmetro para não administradores.

class Users::RegistrationsController < Devise::RegistrationsController
  before_filter :remove_admin_params, :only => [:create, :update]

protected
  # disable setting the role_ids value unless an admin is doing the edit.
  def remove_admin_params
    params[:user].delete(:role_ids) unless current_user.try(:admin?)
  end
end

Apenas certifique-se de adicionar as visualizações de registro a /app/views/users/registrations/.

Outras dicas

A melhor maneira que encontrei de lidar com isso é RailsCast 237 .É mais prolixo do que a resposta de Arrel, mas não o força a adicionar função (ou outros campos) a attr_accessible.

Adicione o seguinte método em um inicializador:

class ActiveRecord::Base
  attr_accessible
  attr_accessor :accessible

  private

  def mass_assignment_authorizer(role = :default)
    if accessible == :all
      self.class.protected_attributes # hack
    else
      # super returns a whitelist object
      super + (accessible || [])
    end
  end
end

Então, em seu controlador, você pode fazer:

user.accessible=: role if can?: set_role, recurso

Esta chamada, infelizmente, deve ser feita após o objeto do usuário (ou qualquer outro) ter sido instanciado.Isso significa que você teria que criar uma subclasse do controlador e chamá-lo após a instanciação do recurso em update e create.

Isso é para Rails 3.2.Em versões anteriores, acredito que o método mass_assignment_authorizer não leva um parâmetro.O attr_accessible sem valores define uma negação ampla do aplicativo à prova de falhas para atribuição em massa.Isso também pode ser feito no arquivo application.rb com

config.active_record.whitelist_attributes = true
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top