1

嵌套形式下通過外鍵的屬性我有三個型號:如何通過Rails的3

class Client < ActiveRecord::Base 
    has_many :balancesheets 
    has_many :investment_assets, :through => :balancesheets 

class Balancesheet < ActiveRecord::Base 
    belongs_to :client 
    has_many :investment_assets, :dependent => :destroy 
    accepts_nested_attributes_for :investment_assets, :allow_destroy => true 

class InvestmentAsset < ActiveRecord::Base 
    belongs_to :balancesheet 
     belongs_to :client 

我有有外鍵CLIENT_ID做兩個問題。首先,當我創建新的資產負債表時,我使用collection_select從列表中選擇客戶端。我寧願將新的balancesheet鏈接放在客戶端顯示頁面上,只是將客戶端ID傳遞給表單,所以我不必從列表中選擇客戶端或在字段中鍵入它。首先,我該怎麼做?

其次,investment_asset模型嵌套在balancesheet表單中。一切正常,除了investment_asset的client_id屬性爲空。我不知道爲什麼,因爲我的協會似乎沒問題。所以問題是,我如何通過嵌套窗體向下傳遞這個client_id屬性?我可以發佈模型或控制器,只是讓我知道。

UPDATE我已經找到了我的第一個問題的答案here。但是,我仍然試圖根據這個答案找出第二部分,也就是說,如何通過嵌套表單傳遞此client_id?要顯示它是如何工作創建一個資產負債表時,通過用戶ID,這裏是客戶端顯示頁面鏈接:

<%= link_to 'New BalanceSheet',new_balancesheet_path(:id => @client.id) %> 

在資產負債表的形式我有一個隱藏字段:

<%= f.hidden_field :client_id %> 

而在資產負債表控制器這是新的動作:

@balancesheet = Balancesheet.new(:client_id => params[:id]) 

這工作得很好。所以對於一個我使用Ryan Bates nested_form gem的investment_asset,它有一個不同的鏈接語法。因此,資產負債表內形成的鏈接添加一個新的investment_asset是:

<%= f.link_to_add "Add asset", :investment_assets %> 

我無法弄清楚如何通過用戶ID像我一樣對與資產負債表:

(:id => @client.id) 

我可以把相同的東西放在投資控制器的新操作中,並添加一個隱藏字段,但我不確定如何在鏈接上傳遞它。思考?

+0

只是爲了初步清晰起見,您的嵌套表單中是否隱藏了字段來保存客戶端ID?其次,是否可以在控制器的'create'動作中單獨設置客戶端ID?如果所有權在您的應用程序中尤爲重要,您可能希望避免信任由用戶提交的任何客戶端ID。當然,如果客戶端已經過身份驗證並自行提交表單,那麼第二部分只適用。 – sscirrus 2011-04-28 10:27:12

+0

@sscirrus - 我確實在表格中隱藏了字段。這個應用程序的使用將是我們公司內部的員工,而不是公衆或用戶註冊,所以它不得不從登錄的用戶,而是從正在查看的客戶端頁面獲取當前的ID。我可以在創建時將用戶ID傳遞給balancesheet,但仍然無法爲investment_assets執行此操作。它們在Railscast教程[這裏](http://asciicasts.com/episodes/196-nested-model-form-part-1)之後是嵌套形式,事實上,它們甚至沒有控制器。這是否澄清?感謝您的反饋。 – FattRyan 2011-04-28 15:45:58

回答

0

這可能是我所知道的全部黑客攻擊,但我所知道的是非常有限的。我最終在這裏做的是用戶jQuery從資產負債表中獲取id,並將其強制爲一個隱藏字段for investment_asset。 jQuery的:

// get the value from the balancesheet hidden field that contains the user_id value 
var balsheetclientid = jQuery('#hiddenid').attr('value'); 
// insert it into the value attribute in the hidden field with class name .iaclientid 
jQuery('.iaclientid').val(balsheetclientid) 

然後我的隱藏字段是這樣的:

<%= f.hidden_field :client_id, :class => 'iaclientid', :value => '' %> 

它工作得很好。希望這是一個有效的方式。