#ruby-on-rails #ruby-on-rails-5.2 #simple-form-for
#ruby-on-rails #ruby-on-rails-5.2 #простая форма для
Вопрос:
Я использую simple_form_for
<%= simple_form_for( @form_object, url: wizard_path, :method => :put) do |f| %>
<%= f.input :website %>
<%= f.submit %>
</div>
<% end %>
Тем не менее, я также использую объект Form
class Base
include ActiveModel::Model
# Validations
# Delegations
# Initializer
end
Моя проблема в том, что мои входные данные не отображаются на столбцы моей базы данных, поэтому https://github.com/plataformatec/simple_form#available-input-types-and-defaults-for-each-column-type
Ничего из этого не отображается, и могу ли я создать пользовательские сопоставления.
Как я могу разрешить Simple_form видеть мои типы столбцов и корректно работать?
Если я проверяю класс моих делегированных полей, они, похоже, отображаются как :string или : integer и т.д.
Комментарии:
1. «В следующей таблице показан html-элемент, который вы получите для каждого атрибута в соответствии с его определением в базе данных. Эти значения по умолчанию можно изменить, указав вспомогательный метод в сопоставлении столбцов в качестве опции as:.» по вашей ссылке. Похоже,
<%= f.input :website, as: :string %>
это то, что вы ищете? Также кажется, что вы могли бы использоватьActiveModel::attribute
метод для указания типа в Base, напримерattribute :website, :string
2. Я использую
delegate attr.to_sym, "#{attr}=".to_sym, to: model
, а не атрибут, могу ли я добавить тип с помощью делегата, если да, то как? Я предпочитаю не устанавливать вручную параметр as:3. @engineersmnky ^ Есть мысли?
4. Попробуйте добавить
type_for_attribute
иhas_attribute?
в делегирование, например,delegate :type_for_attribute, :has_attribute?, to: model
кажется, что это должно работать в соответствии с исходным кодом5. Я не думаю, что это допустимо, поскольку он просто увидит:string или: integer в качестве другого атрибута
Ответ №1:
simple_form
использует 2 метода для определения отображения поля типа ввода из стандартной модели ( type_for_attribute
и has_attribute?
). Источник
Поскольку вы оборачиваете модель в другой слой, но все еще хотите получить вывод, который simple_form
обеспечивает, вам просто нужно делегировать эти вызовы исходной модели через
class Wrapper
include ActiveModel::Model
attr_reader :model
delegate :type_for_attribute, :has_attribute?, to: :model
def initialize(model)
@model = model
end
end
Однако, если бы вы не оборачивали модель, вам нужно было бы определить эти методы самостоятельно, например (используя новый API атрибутов rails 5.2)
class NonWrapper
include ActiveModel::Model
include ActiveModel::Attributes
attribute :name, :string
def type_for_attribute(name)
self.class.attribute_types[name]
end
def has_attribute?(name)
attributes.key?(name.to_s)
end
end
Пример
a = NonWrapper.new(name: 'engineersmnky')
a.has_attribute?(:name)
#=> true
a.type_for_attribute(:name)
#=> => #<ActiveModel::Type::Value:0x00007fffcdeda790 @precision=nil, @scale=nil, @limit=nil>
Примечание для работы такого объекта form с simple_form могут потребоваться другие дополнения. Этот ответ просто объясняет, как обрабатывать вывод о отображении входных данных