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

Jag*_*ari 6 ruby-on-rails nested-forms

我使用瑞安贝茨嵌套模型形式它工作正常,但
我有两个模型我,e存储和订单都有嵌套模型称为项目.

存储:

has_many :orders  
has_many :items, :dependent => :destroy
accepts_nested_attributes_for :items
Run Code Online (Sandbox Code Playgroud)

订购:

belongs_to:storage         
has_many :items, :dependent => :destroy
accepts_nested_attributes_for :items
Run Code Online (Sandbox Code Playgroud)

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

<%= f.select :storage_id,
            Storage.all.map{|s| [s.store_no, s.id]} %>
Run Code Online (Sandbox Code Playgroud)

在选择存储编号时,相应的项目应出现在订单表格中,部分
可以让任何机构告诉我最佳方式.

谢谢,

And*_*rew 7

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

  1. 存储选择器的ID为"存储"
  2. Storage选择器的id为"storage"作为其值

...你可以把它放在你的storage.coffee.js文件中:

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

然后,假设Orders嵌套在存储下,如果您的OrdersController如下所示:

OrdersController < ApplicationController

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

end
Run Code Online (Sandbox Code Playgroud)

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

...如果您div#orders的页面上有一个您希望订单落入...

...然后你应该能够app/views/orders/index.js.erb像这样制作一个文件:

$('div#orders').html('<%= escape_javascript(render @orders) %>');
Run Code Online (Sandbox Code Playgroud)

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

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

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