我有一个带有嵌套字段的模型。
class Contract < ApplicationRecord
...
has_many :contract_tracks
has_many :tracks, -> { distinct }, through: :contract_tracks
has_many :releases, -> { distinct }, 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
名称(它们与多对多相关)。而且我只需要在此特定位置显示它即可。
答案 0 :(得分:1)
如果您只想自定义显示在每条记录上的名称,则无需指定其他类型的数据: 默认情况下,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