Simple_form с отсутствующим отображением объекта Form

#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 могут потребоваться другие дополнения. Этот ответ просто объясняет, как обрабатывать вывод о отображении входных данных