5

En mi aplicación todo funciona bien, pero en mi servidor de administración activa no obtengo mis roles de usuario mostrados en la pantalla.ActiveAdmin - implementar HABTM/matriz multidimensional en DSL

que tienen dos modelos de "usuario" y "roles":

class Role < ActiveRecord::Base 
    has_and_belongs_to_many :users, :join_table => :roles_users 
end 

class User < ActiveRecord::Base 
    has_and_belongs_to_many :roles, :join_table => :roles_users 
end 

consigo que funcione en la consola de rieles:

ruby-1.9.2-p290 :006 > user.roles 
=> [#<Role id: 3, name: "Student">, #<Role id: 2, name: "Supervisor">] 
ruby-1.9.2-p290 :007 > user.roles[0].name 
=> "Student" 
ruby-1.9.2-p290 :008 > user.roles[1].name 
=> "Supervisor" 

y yo tratamos de varias formas de implementar esto en activo Admin DSL (uno de ellos):

ActiveAdmin.register User do 
    index do 
    column :email 
    column "Role" do |user| 
     user.roles.each do |p| 
     p.name 
     end 
    end 
    end 
end 

¿Alguien podría ayudarme? ¿Cómo hago para que funcione en DSL de Active Admin?

Respuesta

13

No he probado esto por mí mismo, pero creo que tiene que devolver una cadena desde el bloque en "columna", así que algo como

column "Role" do |user| 
    user.roles.map({ |p| p.name }).join(' ') 
end 

podría funcionar.

+1

Está funcionando! ¡¡¡¡¡Gracias!!!!! ¡¡¡Muchas gracias!!! :) Dios mío, no puedo creerlo. Está funcionando :) – user930328

+1

Esto arrojó un error para mí, pero eliminar el '()' alrededor de la llamada al mapa solucionó el problema. – jordancooperman

3

Para poder manipular las asociaciones de la administración, se tendrá que añadir una entrada a el bloque de formularios además del código en el bloque de índice. También puede agregar funciones de usuario a la pantalla de presentación dentro del bloque de presentación.

ActiveAdmin.register User do 
    index do 
    column :email 
    column "Role" do |user| 
     (user.roles.map{ |p| p.name }).join(' ') 
    end 
    end 

    form do |f| 
    f.inputs do 
     f.input :email 
     f.input :roles # add roles input here 
    end 
    f.buttons 
    end 

    show do 
    div :class => 'panel' do 
     h3 'User Details' 
     div :class => 'panel_contents' do 
     div :class => 'attributes_table user' do 
      table do 
      tr do 
       th { 'Email' } 
       td { user.email } 
      end 
      tr do 
       th { 'Roles' } 
       td { (user.roles.map { |p| p.name }).join(' ') } 
      end 
      end # table 
     end # attributes_table 
     end # panel_contents 
    end # panel 
    end # show 
end 
+0

si hubieras publicado esto solo una semana antes: D Por ahora ya lo he descubierto. Pero gracias por publicarlo. Vamos a dejarlo aquí para futuras referencias. Podría ayudar a alguien más :) – user930328

+0

@ user930328: Tuve que personalizar ActiveAdmin para mi primer proyecto de Rails y esta pregunta me apuntó en la dirección correcta. Yo también tuve que averiguar el resto yo mismo y lo publiqué para cualquier otra persona que pudiera encontrarlo útil, ya que no está en los documentos de ActiveAdmin. – dkobozev

+0

Mientras estamos en ello, la misma pregunta sobre los filtros: Quiero filtrar Roles en la barra lateral. Pero como "Roles" no existe físicamente como atributo en la base de datos, AA ni siquiera lo muestra.Ya traté de definirlo como un método en mi modelo de usuario. A AA tampoco le importa eso. No muestra el filtro :(¿Alguna idea? – user930328

1

También podría agregar enlaces a los artículos en la lista. (Por supuesto, esto sólo tiene sentido si el modelo que está lista, en este caso, "roles" - es también un recurso ActiveAdmin)

Ejemplo:

column "Role" do |user| 
    user.roles.map { |p| link_to p.name admin_role_path}.join(' ,').html_safe 
end 

No estoy seguro si esto se aplica a su caso, pero lo encontré útil.

+0

Eso no funcionó, pero encontré una alternativa: la función 'auto_link'. Http://www.rubydoc.info/github/gregbell/active_admin/ActiveAdmin/ViewHelpers/ AutoLinkHelper –

0

Esto funciona para mí:

column :role do |user| 
    user.role.map{ |role| role.name }.join(' ') 
end 
0

para vincularlos con auto_link como se menciona en uno de los comentarios anteriores:

column "Role" do |user| 
    user.roles.map { |p| auto_link(p) }.join(', ').html_safe 
end