#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 =)