Rails 3 /不带模型的表单:如何创建不与模型绑定的表单?


70

我有一个模型,并且有一个视图,该视图显示用于基于该模型创建新对象的表单。我们称该表格为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真正询问用户要创建多少个对象,而不是询问对象的特定属性。


2
使用form_tag或其他表单助手
2011年

已经解决:stackoverflow.com/q/804313/428813,请查看Sarah
Ramon Araujo的

Answers:


119

使用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


35

从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

要创建无表模型,

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活动模型


一个还必须包括ActiveModel :: Conversion并定义persisted?为false。
mlt

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.