Rails 3 / Form没有Model:如何创建一个与模型无关的表单?

时间:2011-01-26 14:40:17

标签: ruby-on-rails ruby-on-rails-3 activerecord

我有一个模型,我有一个视图,显示一个基于该模型创建新对象的表单。我们称这个形式为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 个答案:

答案 0 :(得分:117)

使用form_tag代替form_for,然后使用相应的表单助手:text_field_tag代替f.text_fieldtext_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

答案 1 :(得分:35)

从rails3开始,验证已与ActiveRecord分离,因此您可以创建可用作表单助手的验证器的vanilla对象:

 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| %>
...

这是一种方便的方法,可以为电子邮件表单之类的东西获取表单助手的好处,而无需创建与模式绑定的模型对象。

答案 2 :(得分:5)

要创建无表格模型,

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

答案 3 :(得分:4)

如果您希望使用SimpleForm,那么这里有一个特定的答案Does form_tag work with Simple_form?