【问题标题】:ActiveAdmin - implement HABTM / multidimensional array in DSLActiveAdmin - 在 DSL 中实现 HABTM / 多维数组
【发布时间】:2011-09-14 16:48:41
【问题描述】:

在我的应用程序中一切正常,但在我的 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 中工作?

【问题讨论】:

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


    【解决方案1】:

    我自己没有测试过这个,但我相信你需要从“列”中的块中返回一个字符串,所以像

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

    可能会起作用。

    【讨论】:

    • 它正在工作!谢谢!!!!!非常感谢!!! :) 天哪,我简直不敢相信。它正在工作:)
    • 这对我来说是一个错误,但删除 map 调用周围的 '()' 解决了问题。
    【解决方案2】:

    这是工作代码(在我的例子中):

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

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

    【讨论】:

      【解决方案3】:

      为了能够从管理员操作关联,除了索引块中的代码之外,您还需要向表单块添加一个输入。您还可以将用户角色添加到显示块内的显示屏幕。

      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
      

      【讨论】:

      • 如果你能在一周前发布这个:D 现在我自己已经想通了。但是感谢您发布它。让我们把它留在这里以供进一步参考。它可能会帮助其他人:)
      • @user930328:我必须为我的第一个 Rails 项目定制 ActiveAdmin,这个问题为我指明了正确的方向。我也必须自己弄清楚其余部分并将其发布给任何可能觉得它有用的人,因为它不在 ActiveAdmin 文档中。
      • 当我们这样做时,关于过滤器的同样问题:我想在侧边栏中过滤角色。但由于“角色”在数据库中实际上并不作为属性存在,因此 AA 甚至不显示它。我已经尝试将其定义为我的用户模型中的方法。 AA 也不在乎。它没有显示过滤器:(有什么想法吗?
      【解决方案4】:

      您还可以添加指向列表中项目的链接。 (当然,这仅在您列出的模型(在本例中为“角色”)也是 ActiveAdmin 资源时才有意义)

      例子:

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

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

      【讨论】:

      【解决方案5】:

      这对我有用:

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

      【讨论】:

        【解决方案6】:

        如上述任一 cmets 所述,将它们与 auto_link 链接:

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

        【讨论】:

          猜你喜欢
          • 2014-01-31
          • 1970-01-01
          • 1970-01-01
          • 2012-11-17
          • 1970-01-01
          • 2011-06-24
          • 2021-09-17
          • 1970-01-01
          相关资源
          最近更新 更多