Will
Will

Reputation: 4705

Collection select for has_many through

How can I get a collection select to show the submitted values as selected when the form redisplays? for example if a different field does not validate, the multi select box should show the selected items

<%= collection_select(:coupon, :activity_ids,
                            current_user.provider.activities, :id, :name,
                            {},
                            {:multiple => true, :class => 'chosens-select',   :name=>'coupon[activity_ids][]'}) %>

Upvotes: 0

Views: 62

Answers (3)

Will
Will

Reputation: 4705

Thanks to the guys posting answers, It pushed me to give up "fixing" the form and look again at my controller. Turns out I had made a mistake in the params statement:

def coupon_params
  params.require(:coupon).permit(:id, :provider_id, :code, :max_uses, :max_uses_per_customer, :name, :expires_at,
    :dollar_discount, :percent_discount, :starts_at, :activity_ids => {})
end

where it should be

def coupon_params
      params.require(:coupon).permit(:id, :provider_id, :code, :max_uses, :max_uses_per_customer, :name, :expires_at,
        :dollar_discount, :percent_discount, :starts_at, :activity_ids => [])
end

spot the difference? the activity_ids should be an array, not a hash

:activity_ids => []

Upvotes: 0

Dougui
Dougui

Reputation: 7232

I suggest to user SimpleForm. You will just do :

simple_form_for(my_model) do |f|
  f.association :activities
  f.button :submit
end

It will simplify all your forms.

Upvotes: 1

Pavan
Pavan

Reputation: 33542

Something like this would do.

<%= collection_select(:coupon, :activity_ids,current_user.provider.activities, 
:id, :name, {:selected => @coupon.activity_ids}, {:multiple => true, :class => 'chosens-select', :name=>'coupon[activity_ids][]'}) %>

Upvotes: 1

Related Questions