simple_form принимает хеш для ввода коллекции - PullRequest
0 голосов
/ 21 марта 2019

Текущее поведение

С simple_form вам нужно передать массив:

<%= f.input :my_field, collection: [[true,"Yes"],[false,"No"]] %>

Ожидаемое поведение

Было бы неплохо иметь возможность передавать хеш, поэтому вам не нужно делать invert.sort для каждого пройденного хеша. Есть ли способ сделать это для каждого входа?

<%= f.input :my_field, collection: {"true"=> "yes", "false"=>"No" } %>

Можно ли передать хеш напрямую во вход без invert.sort?

Ответы [ 2 ]

1 голос
/ 21 марта 2019

Вы можете добавить своего собственного помощника my_simple_form_for, чтобы использовать свой собственный YourFormBuilder

module ApplicationHelper
  def my_form_for record, options = {}, &block
    options[:builder] = MyFormBuilder
    simple_form_for(record, options, &block)
  end
end

Или просто использовать его следующим образом:

<%= simple_form_for @record, builder: MyFormBuilder do |f| %>

В своем собственном сборщике выможно перезаписать input:

class YourFormBuilder < SimpleForm::FormBuilder

  def input(attribute_name, options = {}, &block)
    options[:collection] = options[:collection].invert.sort if options[:collection].present? and options[:collection].kind_of? Hash
    super
  end

end
0 голосов
/ 21 марта 2019

Исходя из наших предыдущих вопросов и ответов , вы можете улучшить расширение Hash, включив в него as_select_options:

module DropdownExt

  def self.extended(receiver)

    receiver.each do |k,v|
      define_method(k) do 
        v.is_a?(Hash) ? v.extend(DropdownExt) : v
      end
    end

    define_method(:as_select_options) do 
      unless receiver.values.map{|v|v.class}.include?(ActiveSupport::HashWithIndifferentAccess)
        receiver.invert.sort
      else
        []
      end
    end

  end
end

class Dropdowns

  class << self

    private

    def dropdowns_spec
      YAML.load_file("#{path}").with_indifferent_access
    end

    def path
      Rails.root.join("spec/so/dropdowns/dropdowns.yaml") # <== you'll need to change this
    end

  end

  dropdowns_spec[:dropdown].each do |k,v|
    define_singleton_method k do 
      v.extend(DropdownExt)
    end
  end

  %i(
    truck_model
    bike_model
  ).each do |to_alias|
    singleton_class.send(:alias_method, to_alias, :car_model)
  end

end

, что позволит вам сделать что-то вроде:

Dropdowns.car_model.field1.as_select_options
 => [["false", "no"], ["true", "yes"]]

Или, я полагаю:

<%= f.input :my_field, collection: Dropdowns.car_model.field1.as_select_options %>

Это не избегает invert.sort.Но это немного похоронит и обернет это удобным as_select_options методом.

...