Formtastic ~> 2.0.2 и enumerated_attribute gem, Rails 3.1.1 - PullRequest
0 голосов
/ 14 октября 2011

Я использовал enumerated_attribute с formtastic ~> 1.2.3 с "monkey patch" для поля: 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 Ответ

1 голос
/ 15 октября 2011

Их способ определения пользовательских полей полностью изменился в 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

...