Rails 3 / Form没有模型:我如何创build一个不绑定到模型的表单?
我有一个模型,我有一个视图,显示一个基于该模型创build一个新的对象的forms。 我们称之为Form1
。
一旦用户提交Form1
,就创build了该对象。 然后,我想在下一页显示Form2
的第二个表单,要求用户在将对象保存到数据库之前检查各种选项。
我的问题可能是非常基本的。 我不知道如何创buildForm2
,因为它不直接绑定到模型上。 因为我是Rails
新手,所以我只创build表单如下:
form_for(@object) { |f| ... }
@object
是从模型实例化的一个对象
问题 :我不相信这种代码在我的目的下可以工作。 如何创buildForm2
,因为它不能基于@object
或@object
的模型?
从我的应用程序的一些细节 :
该网站在redirect到OAuth
服务器之前接受值( Form1
)。
当用户在OAuth
服务器上validation她的凭据时,她被redirect回我的网站。 然后, XML-RPC
请求将检索有关OAuth
服务器上用户帐户的信息。
XML
响应可能表示用户在OAuth
服务器上只有一个帐户。 如果是这样,则从XML
中检索一些值并将其添加到对象中,然后(最后)将其保存到数据库中,然后将用户redirect到成功页面。
但是,如果XML
响应表明用户在OAuth
服务器上有多个帐户,我想要显示一个表单( Form2
),以允许用户selectOAuth服务器上哪些帐户与我的网站相关联。 所以Form2
确实要求用户创build多less个对象,而不是一个对象的特定属性。
使用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
从rails3开始,validation已经从ActiveRecord中分离出来,所以你可以创build一个可以用来作为表单助手的validation器的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| %> ...
这是一种方便的方式来获得forms助手的好处,如电子邮件forms,而不必创build一个模型对象绑定到您的模式。
如果你正在寻找使用SimpleForm那么这里有一个特定的答案是否form_tag使用Simple_form?
要创build一个无表模型,
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 %>
另一个类似的解决scheme可以在RailsCasts
find: 主动模型