Formtastic ~> 2.0.2 и enumerated_attribute gem, Rails 3.1.1

#formtastic #rails-3.1 #enumerated-types

#formtastic #rails-3.1 #перечисляемые типы

Вопрос:

Я использовал enumerated_attribute с formtastic ~> 1.2.3 с «обезьяньим патчем» для field :as => :enum, и все работало нормально.

Но когда я обновил formtastic до версии 2.0.2, появилась ошибка с сообщением «Formtastic::UnknownInputError».

Для получения более подробной информации здесь приведен патч, который был добавлен в /initialisers/formtastic.rb:

 module Formtastic #:nodoc:
  class SemanticFormBuilder #:nodoc:
    def enum_input(method, options)
      unless options[:collection]
        enum = @object.enums(method.to_sym)
        choices = enum ? enum.select_options : []
        options[:collection] = choices
      end
      if (value = @object.__send__(method.to_sym))
        options[:selected] ||= value.to_s
      else
        options[:include_blank] ||= true
      end
      select_input(method, options)
    end
  end
end
  

PS Я попытался изменить SemanticFormBuilder на FormBuilder (как я понял из новой документации formtastic, такое изменение было для всех пользовательских входных данных), но я все еще получал ошибку

Может быть, кто-нибудь уже успешно использовал эти драгоценные камни вместе?

Ответ №1:

Способ определения пользовательских полей полностью изменился в Formtastic 2.x

Вам нужно подклассировать внутренние классы Formtastic, чтобы получить то, что вы хотите. Выбранный ввод будет выглядеть примерно так:

 module FormtasticExtensions
  class EnumeratedInput < Formtastic::Inputs::SelectInput
    def collection
      # programmatically build an array of options in here and return them
      # they should be in this format:
      # [['name', 'value'],['name2', 'value2']]
    end
  end
end
  

Включите модуль в инициализатор Formtastic:


include FormtasticExtensions

и это даст вам поле :as => :enumerated , и вы должны быть готовы к работе. В моем случае (какое-то другое настраиваемое поле) он выбирает текущую опцию, но вам может потребоваться настроить код для вашей работы.

Вы также можете просто передать коллекцию в:


f.input :thing, :as => :select, :collection => your_collection, :label_method => :your_name, :value_method => :your_id

Комментарии:

1. Спасибо за ответ. Я наконец-то заработал с вашим методом сбора, но я использовал способ с файлом app/inputs/enum_input.rb, где я описал класс EnumInput < Formtastic::Inputs::selectInput . Я нашел это позже в github =)