如何在rails_admin的嵌套字段中为输入字段自定义操作?

问题描述

我有一个带有嵌套字段的模型。

class Contract < ApplicationRecord
...
  has_many :contract_tracks
  has_many :tracks,-> { distinct },through: :contract_tracks
  has_many :releases,through: :contract_tracks
...

我需要在tracks字段上自定义操作-我需要仅在此输入上显示相关的Artist名称和Track名称

我该如何实现?

我经历了source,发现最终归结为field.render。 那是很长的路要走。

我可以复制this partial _form_nested_many.html.haml吗?

.controls.col-sm-10{data: { nestedmany: true }}
  .btn-group
    %a.btn.btn-info.toggler{:'data-toggle' => "button",:'data-target' => "#{form.jquery_namespace(field)} > .tab-content,#{form.jquery_namespace(field)} > .controls > .nav",class: (field.active? ? 'active' : '')}
      %i.icon-white
    - unless field.nested_form[:update_only] || !field.inline_add
      = form.link_to_add "<i class=\"icon-plus icon-white\"></i> #{wording_for(:link,:new,field.associated_model_config.abstract_model)}".html_safe,field.name,{ class: 'btn btn-info' }
  = form.errors_for(field)
  = form.help_for(field)
  %ul.nav.nav-tabs

.tab-content
  = form.fields_for field.name do |nested_form|
    - if field.nested_form[:allow_destroy] || nested_form.options[:child_index] == "new_#{field.name}"
      = nested_form.link_to_remove '<span class="btn btn-small btn-danger"><i class="icon-trash icon-white"></i></span>'.html_safe
    = nested_form.generate({action: :nested,model_config: field.associated_model_config,nested_in: field })

谢谢。


更新1

我正在考虑添加一个Artist一起显示的相关Track名称(它们与多对多相关)。而且我只需要在此特定位置显示它即可。

解决方法

如果您只想自定义显示在每条记录上的名称,则无需指定其他类型的数据: 默认情况下,rails admin使用实例的name属性显示它们。 但是我认为,最好给他们自己的Rails管理员特定名称,因为您经常希望该名称与您的运营团队相关​​,而不必与最终用户相关,

这样,您可以告诉Rails管理员使用哪种方法在初始化程序配置文件上添加此行。

RailsAdmin.config {|c| c.label_methods << :rails_admin_title }

然后您将在标记模型上实现该实例方法

class Tag < ApplicationRecord
   def rails_admin_title
      "#{self.name} #{self.id}"
   end 
end

更新

我假设您只想在管理员而非所有其他在管理员上显示曲目的地方编辑合同时显示此自定义名称。

如果尚未定义,则需要使用所有不需要的字段来定义编辑块。并覆盖用于获取关联曲目名称的方法。

class Contract < ApplicationRecord
  rails_admin do
    edit do
      # ... all your other fields you want to add
      field :tracks do
        def associated_object_label_method
          :admin_name_on_contract
        end
      end
    end
  end
end

然后定义该方法

class Track < ApplicationRecord
  has_many :artists

  def admin_name_on_contract
    "#{self.name} #{artists.map(&:name).join(',')}"
  end
end

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...