module FormSelect::Model::ClassMethods

Public Instance Methods

form_select(method, field: nil, scope: nil) click to toggle source

Use for define helper methods for Rails form.select tag

for example:

class User < ApplicationRecord
  form_select :name, scope: -> { order("name asc") }
  form_select :name_value, field: :name, scope: -> { order("name asc") }
  form_select :email, field: [:name, :email], scope: -> { where(status: :active).order("id desc") }
  form_select :city, field: :city, scope: -> { where("city is not null").select(:city).distinct }
end

<div class="field">
  <%= form.label :user_id %>
  <%= form.select :user_id, User.name_options %>
</div>
<div class="field">
  <%= form.label :email %>
  <%= form.select :email, User.email_options %>
</div>
# File lib/form_select/model.rb, line 32
def form_select(method, field: nil, scope: nil)
  method_name = "#{method}_options"

  if field.blank?
    text_method ||= method
    value_method ||= :id
  else
    field = [field] unless field.is_a?(Array)
    text_method = field.first
    value_method = field.last
  end

  scope ||= -> { all }

  define_singleton_method(method_name) do
    scope.call.collect { |record| [record.send(text_method), record.send(value_method)] }
  end
end