simple_form's collection_radio_button and custom label class

孤者浪人 提交于 2019-11-29 09:33:24

问题


I'm trying to make a star rating form with radio collection using FontAwesome, for this I actually need to change the label classes of the collection_radio_button input generated by simple_form but can't find any obvious solution.

So far I use:

form_for @user do |f|
  f.collection_radio_buttons :rating, [[1, 'Bad'] ,[2, 'Ok'], [3, 'Great']],
                             :first, :last, { item_wrapper_tag: false }
end

Which generates:

<input id="review_rating_1" name="review[rating]" type="radio" value="1" />
<label class="collection_radio_buttons" for="review_rating_1">Bad</label>
<input id="review_rating_2" name="review[rating]" type="radio" value="2" />
<label class="collection_radio_buttons" for="review_rating_2">Ok</label>
<input id="review_rating_3" name="user[options]" type="radio" value="3" />
<label class="collection_radio_buttons" for="review_rating_3">Great</label>

But I'd like the labels to have an extra class, like:

<input id="review_rating_3" name="user[options]" type="radio" value="3" />
<label class="collection_radio_buttons icon-star" for="review_rating_3">Great</label>

UPDATE: This class is defined statically at: https://github.com/plataformatec/simple_form/blob/master/lib/simple_form/tags.rb#L43


回答1:


This can be achieved by using a block:

form_for @user do |f|
  f.collection_radio_buttons :rating, [[1, 'Bad'] ,[2, 'Ok'], [3, 'Great']],
                             :first, :last, { item_wrapper_tag: false } do |b|
    b.radio_button + b.label(:class => "collection_radio_buttons icon-star")
  end
end

This doc can showcase some other example: http://rubydoc.info/github/plataformatec/simple_form/SimpleForm/FormBuilder:collection_radio_buttons




回答2:


In case anyone wonders how to add class to label wrapping radiobutton input when you set boolean_style = :nested here is what I came with:

You can set option called :item_label_class when calling your input, f.e.:

<%= f.input :type, as: :radio_buttons,
                   collection: Listing::TYPES.map{ |type| [Listing.translate_type(type), type] },
                   label: false,
                   item_label_class: 'radio' %>

I wanted to automate this stuff, so I defined custom CollectionRadioButtonsInput class. You need to add to method apply_default_collection_options!:

def apply_default_collection_options!(options)
  super(options)
  options[:item_label_class] == 'radio' if input_type == :radio_buttons
end


来源:https://stackoverflow.com/questions/17190111/simple-forms-collection-radio-button-and-custom-label-class

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!