我有一个模型,我有一个视图,显示一个基于该模型创建新对象的表单。我们称这个形式为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
确实要求用户要创建多少个对象,而不是关于对象的特定属性。
答案 0 :(得分: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 %>
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?