选择框更改时动态嵌套表单

时间:2012-04-20 11:59:24

标签: ruby-on-rails nested-forms

我用Ryan bates嵌套模型表示它工作正常,但是
我有两个模型,e存储和订单都有嵌套模型称为项目。

存储

has_many :orders  
has_many :items, :dependent => :destroy
accepts_nested_attributes_for :items

订单:

belongs_to:storage         
has_many :items, :dependent => :destroy
accepts_nested_attributes_for :items

在订单视图中有存储选择框

<%= f.select :storage_id,
            Storage.all.map{|s| [s.store_no, s.id]} %>

在选择存储编号时,相应的项目应显示在带有部分
的订单表格中 任何人都能告诉我最好的办法。

谢谢,

1 个答案:

答案 0 :(得分:7)

首先,您需要观察输入字段才能看到它已更改。所以,假设:

  1. 存储选择器的ID为“storage”
  2. 存储选择器的id为“storage”作为其值
  3. ...您可以将其放在storage.coffee.js文件中:

    jQuery ->
      $('select#storage').change ->
        storage_id = $('option:selected',this).val()
        $.get 'storages/' +storage_id+ '/orders.js'
    

    然后,假设Orders嵌套在存储下,如果OrdersController看起来如此:

    OrdersController < ApplicationController
    
      def index
        @storage = Storage.find(params[:storage_id])
        @orders = @storage.orders
      end
    
    end
    

    ...如果您有部分app/views/orders/_order.html.erb ...

    ...如果您的网页上有div#orders,那么您希望将订单放入...

    ...那么你应该能够制作一个app/views/orders/index.js.erb文件:

    $('div#orders').html('<%= escape_javascript(render @orders) %>');
    

    这应该为属于给定存储的订单的每个实例呈现部分副本,并在存储选择器之后将其附加到dom。

    正在发生的事情是:当选择菜单被更改时,它会向给定存储的订单索引发出js GET请求。然后该请求将自动尝试提供index.js页面,控制器中设置的实例变量可用于该视图。该视图中的js将在插入任何插入的ruby之后执行,因此您可以使用rails函数(如render @orders),然后通过$('div#orders').html('your rendered orders will be inserted in here by rails')将这些函数的输出注入到dom中。

    显然你必须调整它以适应你的页面,我只是猜测你的页面的哪些元素被调用等,但这个基本概念应该可以正常工作。如果您有任何问题,请告诉我。