0

I am using simple_form grouped_select but I didn't get the output I wanted.

models

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">

view file

= 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

Output

I am getting like the below output with above form.

For PartnerName

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

For Url

<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>

But I want to get output like the below with ParnerName's name and ParnerName's app_name attributes. How can I do this?

For PartnerName

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

For Url

<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>

Thank you.

1 Answer 1

1

You can add a class method for PartnerName

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

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

and use it with the label_method and group_label_method simple_form helpers:

= 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
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.