6

我使用了 Ryan bates 嵌套模型形式,它工作正常,但
我有两个模型,即存储和订单都有嵌套模型称为项目。

贮存:

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]} %>

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

谢谢,

4

1 回答 1

7

首先,您需要查看该输入字段以查看它是否已更改。所以,假设:

  1. 存储选择器的 id 为“存储”
  2. 存储选择器将“存储”的 id 作为其值

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

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

然后,假设 Orders 嵌套在 storage 下,如果您的 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触发到给定存储的订单索引请求。然后,该请求将自动尝试提供 index.js 页面,并在该视图可用的控制器中设置实例变量。该视图中的 js 将在插入任何插值 ruby​​ 后执行,因此您可以使用 rails 函数(如render @orders),然后将这些函数的输出通过 注入到 dom 中$('div#orders').html('your rendered orders will be inserted in here by rails')

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

于 2012-04-22T20:22:49.837 回答