Rails 3/Form without Model: 如何创建不绑定到模型的表单?

我有一个模型,还有一个视图,它显示了一个用于基于该模型创建新对象的窗体。我们称之为 Form1

一旦用户提交了 Form1,就会创建对象。然后,我想在下面的页面上显示第二个表单 Form2,它要求用户在将对象保存到数据库之前勾选各种选项。

我的问题可能非常简单。我不知道如何创建 Form2,因为它没有直接绑定到模型。因为我是一个 Rails的新手,我只创建了如下表单:

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

@object是从模型实例化的对象

问题 : 我不相信这种代码能够满足我的目的。如果它不能基于 @object@object的模型,我该如何创建 Form2

来自我的应用程序的一些细节 :

站点在重定向到 OAuth服务器之前接受值(Form1)。

当用户在 OAuth服务器上验证其凭据时,她将被重定向回我的站点。然后,XML-RPC请求检索有关该用户在 OAuth服务器上的帐户的信息。

XML响应可能表明用户在 OAuth服务器上只有一个帐户。如果是这样,则从 XML中检索一些值并将其添加到对象中——然后(最终)将其保存在数据库中——并将用户重定向到成功页面。

但是,如果 XML响应表明用户在 OAuth服务器上有多个帐户,我希望显示一个表单(Form2) ,允许用户选择 OAuth 服务器上的哪些帐户与我的站点关联。因此,Form2实际上要求用户 有多少对象创建,而不是关于对象的特定属性。

43523 次浏览

使用 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 helpers 的参考资料: http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html

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

这是一种方便的方法,可以从表单帮助程序获得诸如电子邮件表单之类的好处,而不必创建与模式相关联的模型对象。

如果您希望使用 SimpleForm,那么这里有一个关于这个问题的具体答案 Form _ tag 与 Simple _ form 一起工作吗?

要创建无表模型,

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找到: 主动模式