2012-04-20 67 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