ActiveAdmin - 在DSL中实现HABTM /多维数组

时间:2011-09-14 16:48:41

标签: ruby-on-rails arrays ruby-on-rails-3 has-and-belongs-to-many activeadmin

在我的应用程序中,一切正常,但在我的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
有人可以帮帮我吗? 如何让它在Active Admin的DSL中运行?

6 个答案:

答案 0 :(得分:13)

我自己没有对此进行过测试,但我相信您需要从“列”中的块中返回一个字符串,所以类似

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

可能有用。

答案 1 :(得分:5)

这是工作代码(在我的情况下):

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

数组映射函数: http://corelib.rubyonrails.org/classes/Array.html#M000427

答案 2 :(得分:3)

为了能够管理来自admin的关联,除了索引块中的代码之外,还需要向窗体块添加输入。您还可以将用户角色添加到show block中的show screen。

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

答案 3 :(得分:1)

您还可以添加指向列表中项目的链接。 (当然,只有你列出的模型 - 在这种情况下,“角色” - 也是一个ActiveAdmin资源)才有意义

示例:

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

不确定这是否适用于您的情况,但我发现它很有用。

答案 4 :(得分:0)

这对我有用:

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

答案 5 :(得分:0)

如上面其中一条评论所述,将auto_linkcolumn "Role" do |user| user.roles.map { |p| auto_link(p) }.join(', ').html_safe end 相关联:

{{1}}