2012-04-20 75 views
6

我已经使用瑞安贝茨嵌套模型形式它工作正常,但
我有两个模型我,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]} %> 

在选择应该显示在订单形式的存储编号的各项目部分
任何机构都可以告诉我最好的办法。

谢谢,

回答

7

首先,你需要观察输入字段,看看它是否发生了变化。因此,假设:

  1. 存储选择具有“存储设备”
  2. 存储选择具有“存储装置”,其值为

的ID的ID ...你可以把这个在storage.coffee.js文件:

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

然后,假设订单会在存储嵌套,如果你的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中。

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

+0

感谢您的回答我已经使用rails 2.3.5和原型,并遵循这个概念。 – 2012-04-29 06:33:27