【问题标题】:cocoon building resources after form is rendered表单渲染后的茧建筑资源
【发布时间】:2017-12-21 04:02:17
【问题描述】:

我有一张账单表格。打开后,我选择一个供应商来显示供应商的未结采购订单列表。选择采购订单应获取采购订单中订购的所有项目,并将它们显示为账单中的行项目。

当表单已经呈现并且我已经看到嵌套属性和在表单上添加或删除等的链接时,如何实现这一点?

我当前的实现是使用 cocoon 的简单嵌套资源。

<%= simple_form_for(@bill) do |f| %>
  <%= f.error_notification %>
  <div class="form-inputs">
    <%= f.input :vendor_id, as: :select do %>
      <%= f.grouped_collection_select :vendor_id, Warehouse.ordered, :vendors, :name, :id, :name, include_blank: true %>
    <% end %>
  </div>
  <div id="items">
    <div id="ingredient_purchase" class="row">
      <div class="row">
        <%= f.simple_fields_for :warehouse_ingredient_purchase_logs do |warehouse_ingredient_purchase_log| %>
        <%= render 'warehouse_ingredient_purchase_log_fields', :f => warehouse_ingredient_purchase_log %>
        <% end #f.simple_fields_for %>
        <div class="links">
          <%= link_to_add_association 'Add More', f, :warehouse_ingredient_purchase_logs %>
        </div>
      </div>
    </div>
  </div>
  <div class="form-actions">
    <%= f.button :submit %>
  </div>
<% end #simple_form_for(@bill) do |f| %>
<!-- Modal Structure -->
<div id="modal1" class="modal bottom-sheet">
  <div class="modal-content">
    <h4>Purchase Orders</h4>
    <div class="purchase_orders_data"></div>
  </div>
</div>

【问题讨论】:

  • 你能在一张账单中合并不同的采购订单吗?总是只有一个供应商,对吧?
  • 目前正在为每张账单寻找一个采购订单。以后可能会针对多个采购订单对其进行增强。当然,每个账单只有一个供应商。
  • 我会首先收集参数:供应商,以及一个或多个采购订单,然后使用这些数据来构建账单并显示它。您如何实际执行此操作(使用 html 或 ajax/xhr)取决于您,但当您知道应该如何构建账单表单时,实际上等待构建账单表单。清楚吗?
  • 当我已经在账单创建屏幕上时,如何首先收集参数。不确定。我现在的流程是这样的。我来到新的账单屏幕,选择一个供应商,一个带有所有供应商未结采购订单的模式打开,我可以选择我想要使用的采购订单。现在我想要发生的是,一旦我选择了采购订单,该采购订单的行项目应该成为新账单的行项目。我的问题是如何将 3 或 4 或 5 行项目附加到账单屏幕?
  • 选项:1)打开账单创建屏幕,显示供应商列表,显示模式,然后发布并创建账单,然后重定向到编辑(很简单,但账单已经创建,也许你不想要那),2)打开账单创建屏幕,控制器没有参数所以:显示供应商列表,显示模式,然后再次获取账单创建屏幕,但使用给定的参数(供应商+账单)并显示正确的创建表格新法案; 3)打开账单创建,显示供应商列表,打开模式,选择时执行 ajax/xhr 调用以构建表单,然后渲染并继续。

标签: ruby-on-rails cocoon-gem


【解决方案1】:

因此,与其先渲染一个表单,然后尝试使用 javascript 修改它, 我会首先收集参数:供应商和一个或多个采购订单,然后使用这些数据来构建账单,然后显示它。

您如何实际执行此操作(使用 html 或 ajax/xhr)取决于您,但当您知道应该如何构建账单表单时,有效地等待构建账单表单。

可能的方法:

  • 打开账单创建屏幕,显示供应商列表,显示模式,然后发布并创建账单,然后重定向到编辑(很简单,但账单已经创建,也许您不希望这样做),
  • 打开账单创建屏幕,控制器没有参数所以:显示供应商列表,显示模式,然后再次获取账单创建屏幕,但使用给定参数(供应商 + 账单)并显示创建新账单的正确表格;
  • 打开账单创建、显示供应商列表、打开模式,选择后执行 ajax/xhr 调用以构建表单,然后渲染并继续。

这很笼统,但可能有助于解决问题。

【讨论】:

    【解决方案2】:

    您可以通过 ajax 完成此操作

    当您选择其中一项时,您需要对后端服务器执行异步调用。页面不会通过异步调用刷新。

    您可以使用 button_tolink_to 助手触发此操作,然后配置路由以触发您的操作(或仅使用模型对象自动生成路由)并在您的操作中获取这些供应商账单:

    def action
       @vendor = Vendor.find(params[:id])
       @bills = @vendor.bills
       respond_to do |format|
          format.js
       end
    end
    

    在你的js文件action.js.erb你可以编写js逻辑来修改你的表单

    供应商账单也可以包含在部分_object.html.erb 中,action.js.erb 可以将该部分附加到页面中

    $("<%= escape_javascript(render @object) %>").appendTo("#yourHtmlId");
    

    【讨论】:

    • 看起来很有希望让我看看我是否能做到这一点。 JS不是我的强项:(
    • @QaiserWali JS 太棒了……你会很容易理解。请记住广泛阅读所提供的文档,这将使您能够解决您遇到的任何问题。
    猜你喜欢
    • 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
    相关资源
    最近更新 更多