ActiveAdmin - внедрить HABTM / многомерный массив в DSL - PullRequest
5 голосов
/ 14 сентября 2011

В моем приложении все работает нормально, но в моем бэкэнде Active Admin я не отображаю свои роли пользователей на экране.

У меня есть две модели "Пользователь" и "Роли":

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

Я заставляю его работать в консоли rails:

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" 

И я попробовал несколько способов реализовать это в Active Admin DSL (один из них):

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

Может кто-нибудь, пожалуйста, помогите мне?Как мне заставить его работать в DSL Active Admin?

Ответы [ 6 ]

13 голосов
/ 16 сентября 2011

Я сам не проверял это, но я считаю, что вам нужно вернуть строку из блока в столбце, что-то вроде

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

может работать.

5 голосов
/ 19 сентября 2011

Это рабочий код (в моем случае):

column "Role" do |user|
  user.roles.map { |p| p.name }.join('<br />').html_safe
end

Функция карты массива: http://corelib.rubyonrails.org/classes/Array.html#M000427

3 голосов
/ 05 октября 2011

Чтобы иметь возможность манипулировать ассоциациями от администратора, вам необходимо добавить вход в блок форм в дополнение к коду в блоке индекса. Вы также можете добавить роли пользователя на экран показа внутри блока показа.

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
1 голос
/ 13 июня 2012

Вы также можете добавить ссылки на элементы в списке. (конечно, это имеет смысл, только если модель, которую вы перечисляете - в данном случае «роли» - также является ресурсом ActiveAdmin)

Пример:

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

Не уверен, относится ли это к вашему делу, но я нашел это полезным.

0 голосов
/ 19 апреля 2015

Чтобы связать их с auto_link, как указано в одном из комментариев выше:

column "Role" do |user|
  user.roles.map { |p| auto_link(p) }.join(', ').html_safe
end
0 голосов
/ 07 апреля 2013

Это работает для меня:

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