虚拟模型和form_for(或formtastic)

时间:2009-11-25 11:05:28

标签: ruby-on-rails model-view-controller formtastic

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

3 个答案:

答案 0 :(得分:18)

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

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

<% semantic_form_for(:session) do |f| %>
  ...
<% end %>

这会使您的控制器可以使用params[:session]

其次,模型并不意味着 ActiveRecord 模型。我的意思是,Formtastic将使用类似 quacks 的类的任何实例,如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期待的方法,直到你开始工作!

答案 1 :(得分:1)

default_language.rb

class DefaultLanguage
  attr_accessor :language_id
end

foo_controller.rb

  def index
    @default_language = params[:default_language] || Language.find_by_name("English")
  end

index.erb

<% semantic_form_for @default_language do |form| %>
  <% form.inputs :id => 'default_language' do %>
      <%= form.input :id, 
       :as => :select, 
       :collection => @languages, 
       :required => false, 
       :label => "Primary Language:", 
       :include_blank => false %>
    <% end %>
  <% end %>

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

答案 2 :(得分:-1)

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

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