collection_radio_buttons
- 1.0.0
- 1.1.6
- 1.2.6
- 2.0.3
- 2.1.0
- 2.2.1
- 2.3.8
- 3.0.0
- 3.0.9
- 3.1.0
- 3.2.1
- 3.2.8
- 3.2.13
- 4.0.2 (0)
- 4.1.8 (0)
- 4.2.1 (0)
- 4.2.7 (0)
- 4.2.9 (0)
- 5.0.0.1 (38)
- 5.1.7 (0)
- 5.2.3 (0)
- 6.0.0 (0)
- 6.1.3.1 (0)
- 6.1.7.7 (0)
- 7.0.0 (0)
- 7.1.3.2 (0)
- 7.1.3.4 (0)
- What's this?
collection_radio_buttons(object, method, collection, value_method, text_method, options = {}, html_options = {}, &block)
public
Returns radio button tags for the collection of existing return values of method for object's class. The value returned from calling method on the instance object will be selected. If calling method returns nil, no selection is made.
The :value_method and :text_method parameters are methods to be called on each member of collection. The return values are used as the value attribute and contents of each radio button tag, respectively. They can also be any object that responds to call, such as a proc, that will be called for each member of the collection to retrieve the value/text.
Example object structure for use with this method:
class Post < ActiveRecord::Base belongs_to :author end class Author < ActiveRecord::Base has_many :posts def name_with_initial "#{first_name.first}. #{last_name}" end end
Sample usage (selecting the associated Author for an instance of Post, @post):
collection_radio_buttons(:post, :author_id, Author.all, :id, :name_with_initial)
If @post.author_id is already 1, this would return:
<input id="post_author_id_1" name="post[author_id]" type="radio" value="1" checked="checked" /> <label for="post_author_id_1">D. Heinemeier Hansson</label> <input id="post_author_id_2" name="post[author_id]" type="radio" value="2" /> <label for="post_author_id_2">D. Thomas</label> <input id="post_author_id_3" name="post[author_id]" type="radio" value="3" /> <label for="post_author_id_3">M. Clark</label>
It is also possible to customize the way the elements will be shown by giving a block to the method:
collection_radio_buttons(:post, :author_id, Author.all, :id, :name_with_initial) do |b| b.label { b.radio_button } end
The argument passed to the block is a special kind of builder for this collection, which has the ability to generate the label and radio button for the current item in the collection, with proper text and value. Using it, you can change the label and radio button display order or even use the label as wrapper, as in the example above.
The builder methods label and radio_button also accept extra HTML options:
collection_radio_buttons(:post, :author_id, Author.all, :id, :name_with_initial) do |b| b.label(class: "radio_button") { b.radio_button(class: "radio_button") } end
There are also three special methods available: object, text and value, which are the current item being rendered, its text and value methods, respectively. You can use them like this:
collection_radio_buttons(:post, :author_id, Author.all, :id, :name_with_initial) do |b| b.label(:"data-value" => b.value) { b.radio_button + b.text } end
Gotcha
The HTML specification says when nothing is select on a collection of radio buttons web browsers do not send any value to server. Unfortunately this introduces a gotcha: if a User model has a category_id field, and in the form none category is selected no category_id parameter is sent. So, any strong parameters idiom like
params.require(:user).permit(...)
will raise an error since no +{user: …}+ will be present.
To prevent this the helper generates an auxiliary hidden field before every collection of radio buttons. The hidden field has the same name as collection radio button and blank value.
In case if you don’t want the helper to generate this hidden field you can specify include_hidden: false option.