Rails 3/Form without Model: Как создать форму, не привязанную к модели?
У меня есть модель, и у меня есть представление, которое отображает форму для создания нового объекта на основе этой модели. Позвоните в эту форму, Form1
.
Как только пользователь отправляет Form1
, объект создается. Затем я хочу отобразить на следующей странице вторую форму Form2
, которая просит пользователя проверить различные параметры до того, как объект будет сохранен в базе данных.
Моя проблема, вероятно, чрезвычайно простая. Я не знаю, как создать Form2
, учитывая, что он не привязан непосредственно к модели. Поскольку я новичок Rails
, я создал только следующие формы:
form_for(@object) { |f| ... }
@object
- это объект, созданный из модели
Проблема. Я не верю, что такой код будет работать для моих целей здесь. Как создать Form2
, учитывая, что он не должен основываться на модели @object
или @object
?
Некоторые особенности из моего приложения:
Перед перенаправлением на сервер OAuth
сайт принимает значения (Form1
).
Когда пользователь проверяет свои учетные данные на сервере OAuth
, она перенаправляется обратно на мой сайт. Затем запрос XML-RPC
извлекает информацию об учетной записи пользователя на сервере OAuth
.
Ответ XML
может указывать на то, что пользователь имеет только одну учетную запись на сервере OAuth
. Если это так, некоторые значения извлекаются из XML
и добавляются к объекту - который затем (наконец) сохраняется в базе данных - и пользователь перенаправляется на страницу успеха.
Однако, если ответ XML
указывает, что у пользователя несколько учетных записей на сервере OAuth
, я хочу отобразить форму (Form2
), которая позволяет пользователю выбирать, какие учетные записи на сервере OAuth связываться с моим сайтом. Поэтому Form2
действительно запрашивает у пользователя, сколько объектов создавать, а не об определенных атрибутах объекта.
Ответы
Ответ 1
Используйте form_tag
вместо form_for
, затем используйте соответствующие формы: text_field_tag
вместо f.text_field
, text_area_tag
вместо f.text_area
и т.д. Пример:
<%= form_tag "/my_controller/update2" do %>
<%= text_field_tag "account", "default info" %>
<%= submit_tag "Save" %>
<% end %>
Сайт API Rails имеет отличную ссылку на все помощники _tag: http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html
Ответ 2
Начиная с rails3, проверки были отделены от ActiveRecord, поэтому вы можете создавать объекты ванили, которые могут использоваться как валидаторы с помощью хэндлеров формы:
class Person
include ActiveModel::Validations
attr_accessor :first_name, :last_name
validates_each :first_name, :last_name do |record, attr, value|
record.errors.add attr, 'starts with z.' if value.to_s[0] == ?z
end
end
а затем в вашем шаблоне:
<%= form_for(Person.new) do |f| %>
...
Это удобный способ получить преимущества помощников формы для таких вещей, как формы электронной почты, не создавая объект модели, привязанный к вашей схеме.
Ответ 3
Если вы хотите использовать SimpleForm, то для этого есть конкретный ответ Работает ли form_tag с Simple_form?
Ответ 4
Чтобы создать модель без таблицы,
class Person
include ActiveModel::Model
attr_accessor :first_name, :last_name
validates :first_name, :last_name, presence: true
end
Тогда, на ваш взгляд,
<%= form_for(Person.new) do |f| %>
.... your form ....
<% end %>
Другое подобное решение можно найти в RailsCasts
:
Active-Model