【问题标题】:virtual model and form_for (or formtastic)虚拟模型和 form_for(或 formtastic)
【发布时间】:2010-12-20 06:04:24
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    首先,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 所期望的方法,直到你让它工作!

    【讨论】:

    【解决方案2】:

    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 发布表单。

    【讨论】:

      【解决方案3】:

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

      您可以通过在控制器中简单地说 params[:some_attribute] 来获取值。

      【讨论】:

      • 我会说这是因为 OP 正在寻求语义解决方案,理想情况下使用 Formtastic,而您建议退后一步。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多