虚拟模型和form_for(或formtastic)

有时我们需要没有模型创建的表单 – 例如搜索字段或电子邮件,应该在哪里发送一些指令。 创建此表单的最佳方法是什么? 我可以创建虚拟模型或类似的东西吗? 我想使用formtastic,但不是form_tag。

首先,Formtastic在所有情况下都不需要模型,尽管它确实效果最好,并且需要较少的代码与模型。

就像Rails自己的内置form_for ,你可以传入一个符号而不是一个对象作为第一个参数,而Formtastic将构建表单并根据符号发布params。 例如:

 <% 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

 class DefaultLanguage
   attr_accessor:language_id
结束

foo_controller.rb

   def指数
     @default_language = params [:default_language] ||  Language.find_by_name( “英语”)
  结束

index.erb

 <%semantic_form_for @default_language do | form |  %>
   <%form.inputs:id =>'default_language'do%>
       <%= form.input:id, 
        :as =>:选择, 
        :collection => @languages, 
        :required => false, 
        :label =>“主要语言:”, 
        :include_blank => false%>
     <%end%>
   <%end%>

当值改变时,我使用AJAX发布表单。

或者您只需使用form_for创建一个表单,并将模型引用留空。 例如<% form_for "", :url=>some_url do |f| %> <% form_for "", :url=>some_url do |f| %> <%= f.text_field "some_attribute" %> <%= submit_tag "submit" %>

您只需在控制器中输入params [:some_attribute]即可获取值。