2012-06-04 3 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', поэтому маршрут не существует в файле маршрутов, он указан в модели). 2) Я не использую форму (я использую консоль), а атрибуты контроллера '@ policy' и' @ client' не влияют на результат. Я использую 'ActiveResource' и просто вызываю' save' в экземпляре. Этот пример политики уже знает свой собственный ': client_id'. - Я не понимаю ваш ответ? – JellicleCat