代码之家  ›  专栏  ›  技术社区  ›  Trip

如何为嵌套表单生成多个表单?

  •  0
  • Trip  · 技术社区  · 15 年前

    简介

    我有一个对象@organization,它有许多:快速的事实

    基本上,我想为每一个创建一个表单:快速事实,但是有一个保存按钮,它保存了所有快速事实。

    我的两个问题:

    第一个问题:

    我的快速事实并不以他们的信息为前提。对于我所拥有的每一个快速事实,它们只显示为空白。

    第二问题

    每个窗体上都会出现“保存”按钮

    我悲伤的尝试:

    - for quick_fact in @organization.quick_facts
     - fields_for :quick_facts do |f|
       = f.error_messages :header_message => FORM_ERROR_HEADER_MESSAGE, :message => FORM_ERROR_MESSAGE
       = f.label :quick_fact, 'QuickFact'
       %br/
       = f.select :quick_fact, QUICK_FACTS, {}
       %br/
       = f.submit 'save', :class => 'button'
    
    1 回复  |  直到 15 年前
        1
  •  1
  •   Zachary Wright José Valim    15 年前

    你真的只需要一张表格,因为你想一次提交所有的东西。

    以下是我的建议:

    使用分部呈现快速事实的标签和文本选项(如果希望它是文本)。您希望每个快速事实呈现一次此部分,因此请使用render方法上的:collection选项指定快速事实的集合。每个部分都将获得自己的QuickFact的本地副本,并且还将创建一个名为QuickFact_Counter的变量。

    此外,您还需要使用:locals选项将表单作为局部变量传递给分部,这样您就可以执行f.label、f.text_区域。

    所以,总之,你的新形式是这样的:

    <% form_for @organization do |form| %>
      <%= render :partial => "partial_name", :collection => @organization.quick_facts, :locals => {:form => form} %>
      <%=form.submit 'save', :class => 'button'%>
    <% end %>
    

    那么你的那部分就只有

    <%= form.label :quick_fact, 'QuickFact' %>
    <%= form.text_field :quick_fact %>
    

    如果你想更进一步,你可以使用一个布局来呈现表单,并让它服从于部分,但这应该足以让你开始。我最喜欢的Rails功能之一就是将集合传递给分部。