【发布时间】:2010-12-20 06:04:24
【问题描述】:
有时我们需要没有模型创建的表单 - 例如搜索字段或电子邮件,应该在哪里发送一些说明。创建此表单的最佳方法是什么?我可以创建虚拟模型或类似的东西吗?我想使用formtastic,但不是form_tag。
【问题讨论】:
标签: ruby-on-rails model-view-controller formtastic
有时我们需要没有模型创建的表单 - 例如搜索字段或电子邮件,应该在哪里发送一些说明。创建此表单的最佳方法是什么?我可以创建虚拟模型或类似的东西吗?我想使用formtastic,但不是form_tag。
【问题讨论】:
标签: ruby-on-rails model-view-controller formtastic
首先,Formtastic 并非在所有情况下都需要模型,尽管它确实工作得最好,并且需要更少的模型代码。
就像 Rails 自己的内置 form_for 一样,您可以传入符号而不是对象作为第一个参数,Formtastic 将构建表单并根据符号发布参数。例如:
<% semantic_form_for(:session) do |f| %>
...
<% end %>
这将使您的控制器可以使用表单值params[:session]。
其次,model 并不意味着 ActiveRecord 模型。我的意思是,Formtastic 将适用于类的任何实例嘎嘎 像 ActiveRecord 模型。
许多 人使用 Authlogic 通过 Formtastic 进行身份验证的经典示例。 Authlogic 的一部分是 UserSession 模型的想法,它工作得很好:
控制器:
def index
@user_session = UserSession.new
end
表格:
<% semantic_form_for(@user_session) do |f| %>
<%= f.input :login %>
<%= f.input :password %>
<% end %>
这将使您的表单数据在您的控制器中可用params[:user_session]。
真的创建一个模型实例来包装模型的关注点并不难。继续实现 Formtastic 所期望的方法,直到你让它工作!
【讨论】:
default_language.rb
类 DefaultLanguage attr_accessor :language_id 结尾foo_controller.rb
定义索引 @default_language = 参数[:default_language] || Language.find_by_name("英文") 结尾index.erb
'default_language' 做 %> :选择, :collection => @languages, :必需 => 假, :label => "主要语言:", :include_blank => 假 %>当值发生变化时,我使用 AJAX 发布表单。
【讨论】:
或者您只需使用 form_for 创建一个表单并将模型参考留空。
例如
<% form_for "", :url=>some_url do |f| %>
<%= f.text_field "some_attribute" %>
<%= submit_tag "submit" %>
您可以通过在控制器中简单地说 params[:some_attribute] 来获取值。
【讨论】: