2012-06-04 65 views
3

我有一個嵌套的ActiveResource模型(即它在另一個模型的名稱空間內)。試圖撥打save提出:如何在保存嵌套的ActiveResource時指定前綴參數?

ActiveResource::MissingPrefixParam: client_id prefix_option is missing 

如何提供所需的前綴?

這裏是我的類:

class Foo::Bar < ActiveResource::Base 
    self.site = "http://www.example.com" 
    self.prefix = "/clients/:client_id" 
    self.element_name = "policy" 
    self.collection_name = "policies" 
end 

這裏是我救的嘗試:

bar = Foo::Bar.new :client_id => 123 
bar.valid? # => true 
bar.client_id # => 123 
bar.save # => ActiveResource::MissingPrefixParam... 

一次又一次,我已經看了關於這一澄清,但我只找到相同的指令:

When a GET is requested for a nested resource and you don’t provide the prefix_param an ActiveResource::MissingPrefixParam will be raised.

我試圖訪問我們服務器的API端點在http://www.example.com/clients/[client_id]/policies,但我顯然未能提供client_id,所以我的應用程序,使得它要求http://www.example.com/clients//policies

服務器日誌告訴我:ActionController::RoutingError (No route matches "/clients//policies/" with {:method=>:post})

回答

6

如果您創建方法prefix_options ,它提供了一個哈希,其中包含所需的client_id prefix_option,如下所示:

def prefix_options 
    { :client_id => client_id } 
end 
-1

我假設你要創建一個特定的客戶端的新政策。到你應該張貼您的保單信息的路徑應該是:

client_policies_path(@client.id) 

如果您使用的一種形式,你可以使用的form_for這樣的:

form_for [@client, @policy] do 

其中@client@policy#new創建在您的PolicyController中的行爲是這樣的:

def new 
    @client = Client.new(params[:client_id]) 
    @policy = @client.policies.build 
    # ... 
end 
+0

謝謝,但它不起作用。 (我看不出它會如何工作,但我試過了)。 1)沒有'client_policies_path'(我使用'ActiveResource',而不是'ActiveRecord',所以路由不存在於我的路由文件中;它在Model中指定)。 2)我沒有使用表單(我使用的是控制檯),並且設置控制器屬性'@ policy'和'@ client'對結果沒有影響。我正在使用'ActiveResource',只是在實例上調用'save'。有問題的策略實例已經知道它自己的':client_id'。 - 我誤解了你的回答? – JellicleCat