首页 > 解决方案 > Ruby on Rails - 如何使用 simple_form grouped_select 获得自定义输出?

问题描述

我正在使用 simple_formgrouped_select但我没有得到我想要的输出。

楷模

class PartnerName < ApplicationRecord
  has_many :urls, dependent: :destroy
end

#<PartnerName id: 1, name: "technology", app_name: "test">
#<PartnerName id: 2, name: "technology", app_name: "user">

class Url < ApplicationRecord
  belongs_to :network_partner_name
end

#<Url id: 1, partner_name_id: 1, name: "abc.org">
#<Url id: 2, partner_name_id: 1, name: "qwe.org">
#<Url id: 3, partner_name_id: 2, name: "123.org">
#<Url id: 4, partner_name_id: 2, name: "345.org">

查看文件

= simple_form_for(:query, method: :post) do |f|
  = f.error_notification
  .form-row
    .col-auto
      = f.input :network_partner_name_id, collection: PartnerName.order(:name),
                                          include_blank: false
  .form-row
    .col-auto
      = f.input :url_id, collection: PartnerName.order(:name).includes(:urls),
                         as: :grouped_select,
                         group_method: :urls,
                         include_blank: false

输出

我用上面的形式得到了下面的输出。

对于合作伙伴名称

<option value="1">technology</option>
<option value="2">technology</option>

对于网址

<optgroup label="technology">
  <option value="1">abc.org</option>
  <option value="2">qwe.org</option>
</optgroup>
<optgroup label="technology">
  <option value="3">123.org</option>
  <option value="4">456.org</option>
</optgroup>

但我想用 ParnerName 的名称和 ParnerName 的 app_name 属性获得如下输出。我怎样才能做到这一点?

对于合作伙伴名称

<option value="1">technology - test</option>
<option value="2">technology - user</option>

对于网址

<optgroup label="technology - test">
  <option value="1">abc.org</option>
  <option value="2">qwe.org</option>
</optgroup>
<optgroup label="technology - user">
  <option value="3">123.org</option>
  <option value="4">456.org</option>
</optgroup>

谢谢你。

标签: ruby-on-railssimple-form

解决方案


您可以添加一个类方法PartnerName

class PartnerName < ApplicationRecord
  has_many :urls, dependent: :destroy

  def label_collection
    "#{name} - #{app_name}"
  end
end

并将其与label_methodgroup_label_methodsimple_form 助手一起使用:

= simple_form_for(:query, method: :post) do |f|
  = f.error_notification
  .form-row
    .col-auto
      = f.input : network_partner_name_id, collection: PartnerName.order(:name),
                                           label_method: :label_collection,
                                           include_blank: false
  .form-row
    .col-auto
      = f.input :url_id, collection: PartnerName.order(:name).includes(:urls),
                         as: :grouped_select,
                         group_method: :urls,
                         group_label_method: :label_collection,
                         include_blank: false

推荐阅读