Simple_form с отсутствующим отображением объекта формы - PullRequest
1 голос
/ 08 марта 2019

Я использую simple_form_for

<%= simple_form_for( @form_object, url: wizard_path, :method => :put) do |f| %>
    <%= f.input :website %>
    <%= f.submit %>
  </div>
<% end %>

Однако я также использую объект формы

  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 Ответ

2 голосов
/ 09 марта 2019

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>

Примечание могут потребоваться другие дополнения для объекта формы, подобного этому, для работы с simple_form. Этот ответ просто объясняет, как обрабатывать вывод входного отображения

...