Rails 3 / Форма без модели: Как создать форму, не привязанную к модели? - PullRequest
68 голосов
/ 26 января 2011

У меня есть модель, и у меня есть представление, которое отображает форму для создания нового объекта на основе этой модели.Давайте назовем эту форму Form1.

. Как только пользователь отправит Form1, объект будет создан.Затем я хочу отобразить на следующей странице вторую форму Form2, в которой пользователю предлагается пометить различные опции перед сохранением объекта в базе данных.

Моя проблема, вероятно, чрезвычайно проста.Я не знаю, как создать Form2, учитывая, что он не связан напрямую с моделью.Поскольку я Rails новичок, я только создал формы следующим образом:

form_for(@object) { |f| ... }

@object - объект, созданный из модели

Проблема : я не верю, что такой код будет работать для моих целей здесь.Как мне создать Form2, учитывая, что он не должен быть основан на @object или @object модели?

Некоторые особенности из моего приложения :

Сайт принимает значения (Form1) перед перенаправлением на сервер OAuth.

Когда пользователь проверяет свои учетные данные на сервере OAuth, он перенаправляется обратно на мой сайт.Затем запрос XML-RPC возвращает информацию об учетной записи пользователя на сервере OAuth.

Ответ XML может означать, что у пользователя есть только одна учетная запись на сервере OAuth.Если это так, некоторые значения извлекаются из XML и добавляются к объекту - который затем (наконец) сохраняется в базе данных - и пользователь перенаправляется на страницу успеха.

Однако, если ответ XML указывает, что у пользователя есть несколько учетных записей на сервере OAuth, я хочу отобразить форму (Form2), которая позволяет пользователю выбирать, какие учетные записи в OAuthсервер для связи с моим сайтом.Так что Form2 действительно запрашивает у пользователя , сколько объектов нужно создать, а не о конкретных атрибутах объекта.

Ответы [ 4 ]

117 голосов
/ 26 января 2011

Используйте 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 %>

На сайте Rails API есть отличная ссылка на все _tag помощники: http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html

35 голосов
/ 10 октября 2012

Начиная с 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| %>
...

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

5 голосов
/ 15 октября 2015

Чтобы создать модель без таблиц,

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-модель

4 голосов
/ 13 апреля 2013

Если вы хотите использовать SimpleForm, то для этого есть конкретный ответ Работает ли form_tag с Simple_form?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...