有时我们需要没有模型创建的表单 - 例如搜索字段或电子邮件,应该在哪里发送一些说明。创建此表单的最佳方法是什么?我可以创建虚拟模型或类似的东西吗?我想使用formtastic,但不是form_tag。
3 回答
首先,Formtastic 并非在所有情况下都需要模型,尽管它确实工作得最好并且需要更少的模型代码。
就像 Rails 自己的 built-in 一样form_for
,您可以传入符号而不是对象作为第一个参数,Formtastic 将构建表单并根据符号发布参数。例如:
<% semantic_form_for(:session) do |f| %>
...
<% end %>
这将使您的控制器可以使用表单值作为params[:session]
.
其次,模型并不意味着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("英文") 结尾
索引.erb
<% semantic_form_for @default_language 做 |form| %> <% form.inputs :id => 'default_language' 做 %> <%= form.input :id, :as => :选择, :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] 来获取值。