SimpleForm без (не модель)

Можно ли использовать Simple Form (по: Plataformatec) без модели?

https://github.com/plataformatec/simple_form

Вы можете использовать :symbol в качестве первого аргумента.

 <%= simple_form_for :user, url: users_path do |f| %> <%= f.input :name, as: :string %> ... <% end %> 

Он выведет что-то вроде этого:

 
...
...

К сожалению, simple_form полагается на использование модели. По сути, было бы неплохо иметь что-то вроде методов simple_form_tag и input_tag, эквивалентных их рельсам * _tag-помощникам. До тех пор, есть легкая работа вокруг.

Используйте символ вместо classа в форме и явно передайте значение, чтобы предотвратить попытку simple_form доступа к свойствам модели.

 <%= simple_form_for :user, :url => '/users' do |f| %> <%= f.text_field :name, input_html: { value: nil } %> <% end %> 

Это позволит избежать undefined method 'name' for User ошибки undefined method 'name' for User .

Вы также можете использовать поля вне модели в рамках модели формы с помощью simple_fields_for примерно так:

 <%= simple_form_for @user do |f| %> <%= f.input :name %> <%= simple_fields_for :no_model_fields do |n| %> <%= n.input :other_field %> <% end %> <% end %> 

Это простое и практичное решение, потому что вы можете создавать разные поля из разных моделей или без использования моделей

Все вышеприведенные методы оставляют вас с данными формы, вложенными внутри «пользователя» или любого другого символа, который вы передаете в качестве первого аргумента. Это раздражает.

Чтобы имитировать стиль / преимущества simple_form, но удалите зависимость объекта / символа и вложенную вложенность данных, вы можете создать частичный.

Примеры HAML :

вид формы:

 = form_tag("path/to/action", method: "POST") do = render "path/to/partial/field", type: "string", required: true, item: "first_name" 

field :

 - required_string = required ? "required" : "" %div{class: "input #{type} #{required_string} #{item}"} %label{class: "#{type} #{required_string}", for: "#{item}"} - if required %abbr{title: "required"} * = t("application.#{item}") %input{name: "#{item}", | placeholder: t("application.#{item}"), | type: "#{type}", | required: required, | "aria-required" => "#{required}" } 

Вы также можете передать :symbol вместо @object качестве аргумента для simple_form_for .

 <%= simple_form_for :email, :url => '/post_email' do |f| %> <%= f.input :subject, :as => :string %> <% end %> 

Что будет выводить:

  

Помните о следующих сокращениях:

  • Вы не сможете воспользоваться автоматической проверкой модели
  • Необходимо явно определить :url и тип каждого input
Давайте будем гением компьютера.