2010-02-04 2 views
0

Я вызываю приложение rails из другого с помощью ActiveResource. Мне нужно поставить идентификатор нового объекта первого приложения (да, контроллер создать в этом приложении знает, как обращаться с получающим идентификатором), так что я что-то вроде этого:Может ли ActiveResource POST создать вместо PUTTing его при указании идентификатора?

a = ActiveResourceModel.new(:id => 1231231, :name => "test") 
a.save 

Однако, вместо того, чтобы делать POST для создания нового ресурса, который он запускает, заставляя приемное приложение пытаться обновить ресурс с идентификатором 1231231, который, конечно, не существует (я хочу его создать!), Поэтому я получаю ошибку 404 из-за это.

Выполнение некоторых тестов проблемы, похоже, в ActiveResourceModel.new? который возвращает false, а ActiveResourceModel.exists? также возвращает false (отлично, два метода, которые должны быть противоположны, возвращают одинаковые!).

ответ

2

Проверка AResource source and documentation, в new? метод проверки на наличие идентификационного номера и проверки exists? для удаленного ресурса, делая одновременно возвращая то же самое.

Почему именно вам нужно передать идентификатор для создания нового объекта? Не имеет смысла. В любом случае, вы можете попробовать позвонить create вместо save.

+0

Я забыл добавить, создать то же самое, что и новый + сохранить. Идентификатор ... Сущности, которые я буду создавать, одинаковы в обоих приложениях и должны быть синхронизированы. Вместо того, чтобы иметь сопоставление между идентификаторами в каждом приложении, мы решили, что было бы проще использовать uuids в качестве идентификаторов и передать их. – diegogs

+0

создает попытки отправить ресурс напрямую. http://github.com/rails/rails/blob/master/activeresource/lib/active_resource/base.rb#L1327 Вам следует избегать подобных реплик imho. 3-е приложение для централизованных данных может быть менее проблематичным. – Lucas

1

У меня есть противоположная проблема. I EXPECT a PUT при вызове AR.create с идентификатором (поскольку это означает, что запись уже существует). Однако, с Rails 3.1 и выше, похоже, что тот же код в Rails 3.0, который вызвал PUT, фактически вызывает POST. Может ли кто-нибудь подтвердить это изменение? (Поскольку у меня есть контроль над принимающим сервером, я просто скорректировал код POST, чтобы иметь такое же поведение, что и мой старый PUT-код).

+0

Ну, если есть сомнения, проверьте исходный код. В версии 3.0 создать новые проверки? который смотрит, есть ли id.nil? В версии 3.1 и выше он также проверяет новый ?, но теперь, новый? проверяет, сохраняется ли объект (который отличается от проверки, чтобы определить, установлен ли идентификатор). Итак, к оригинальному собеседнику вы получите поведение, которое вы ищете (хотя и довольно поздно) ... –