5

我有一个嵌套的 ActiveResource 模型(即它在另一个模型的命名空间内)。试图跟save注加注:

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}).

4

2 回答 2

6

如果您创建一个方法prefix_options,它将工作,该方法提供一个包含所需的哈希client_id prefix_option,如下所示:

def prefix_options
  { :client_id => client_id }
end
于 2012-06-07T15:11:40.580 回答
-1

我假设您想为特定客户创建新策略。您应该发布政策详细信息的路径应该是:

client_policies_path(@client.id)

如果您使用的是表单,则可以像这样使用 form_for:

form_for [@client, @policy] do

由PolicyController 中的操作创建的位置@client,如下所示:@policy#new

def new
  @client = Client.new(params[:client_id])
  @policy = @client.policies.build
  # ...
end
于 2012-06-05T06:19:23.357 回答