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

Mor*_*ger 68 activerecord ruby-on-rails ruby-on-rails-3

我有一个模型,我有一个视图,显示一个基于该模型创建新对象的表单.我们称之为那种形式Form1.

用户提交后Form1,将创建该对象.然后,我想在下一页上显示第二个表单Form2,该表单要求用户在将对象保存到数据库之前检查各种选项.

我的问题可能非常基本.我不知道如何创建Form2,因为它不直接与模型绑定.因为我是Rails新手,所以我只创建了以下表格:

form_for(@object) { |f| ... }
Run Code Online (Sandbox Code Playgroud)

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

问题:我不相信这种代码在我的目的下会起作用.我如何创造Form2,因为它不能基于@object@object模型?

我的应用程序中的一些细节:

Form1在重定向到OAuth服务器之前,站点接受values().

当用户在OAuth服务器上验证其凭据时,她将被重定向回我的站点.一个XML-RPC请求,然后获取关于用户的账户上的信息OAuth服务器.

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

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

Dyl*_*kow 117

使用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 %>
Run Code Online (Sandbox Code Playgroud)

Rails API站点对所有_tag助手都有很好的参考:http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html


Kar*_*aen 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
Run Code Online (Sandbox Code Playgroud)

然后在你的模板中:

<%= form_for(Person.new) do |f| %>
...
Run Code Online (Sandbox Code Playgroud)

这是一种方便的方法,可以在不必创建与模式绑定的模型对象的情况下,为电子邮件表单等内容提供表单帮助程序的好处.


Lah*_*iru 5

要创建无表格模型,

class Person
  include ActiveModel::Model

  attr_accessor :first_name, :last_name

  validates :first_name, :last_name, presence: true
end
Run Code Online (Sandbox Code Playgroud)

然后在你看来,

<%= form_for(Person.new) do |f| %>
 .... your form ....
<% end %>
Run Code Online (Sandbox Code Playgroud)

另一个类似的解决方案可以在以下位置找到RailsCasts: Active-Model