Создание новой записи базы данных рельсов из внешнего скрипта? - PullRequest
1 голос
/ 04 августа 2011

Я пытаюсь отправить запрос POST из внешнего сценария Ruby в приложение Rails через HTTP#post_form.Запрос сделан к действию create (т. Е. URI http://server/controller).

Если я закодирую один параметр в запросе, все в порядке:

HTTP::post_form(uri, { :my_param => "value" })

Хотя я должен явно вытянуть my_param из params вручную, в контроллере.Это кажется неэффективным и нарушает создание новой записи из самого приложения (поскольку этот параметр отсутствует).Следовательно, я пытаюсь заставить мой сценарий представлять себя как Rails, передавая соответствующие данные так, как этого ожидал бы контроллер, например,

HTTP::post_form(uri, { :object => { :my_param => "value" } })

Однако это не работает.post_form, кажется, ускользает от моего хэша во что-то другое, то есть

{ "object" => [\"my_param\", \"value\"] }

Что, очевидно, не делает то же самое.Я пропускаю что-то очевидное в том, как я передаю данные?Или я не могу достичь того, что мне нужно (создать новую запись вне приложения)?

Ответы [ 2 ]

1 голос
/ 04 августа 2011

Я не знаю много о post_form, но естественным решением для меня было бы использование объекта ActiveResource.

ActiveResource доступен как для ruby, так и для Rails. вы используете его так же, как вы используете модель, только она публикует и получает с использованием XML Существует Railscast о том, как это работает здесь

http://railscasts.com/episodes/94-activeresource-basics

http://railscasts.com/episodes/95-more-on-activeresource

Я думаю, вы обнаружите, что это лучше подходит для ваших требований, чем post_form, но, как я уже сказал, я не знаком с post_form.

1 голос
/ 04 августа 2011

Одним простым способом может быть простое подражание тому, как Rails форматирует свои параметры, например:

params = { :my_param => "value", ... }
params = Hash[params.map { |key,value| ["object[#{key}]",value] } ]

HTTP::post_form(uri, params)

Редактировать: Хорошо, посмотрите на это, я немного осмотрелся и обнаружил, что Rails на самом деле дает вам способ сделать то же самое, используя свой собственный механизм:

require 'active_support/core_ext'
...
HTTP::post(uri, parameters.to_param)

Метод to_param будет корректно обрабатывать массивы и все остальное тоже. Обратите внимание, что в этом случае вы хотите использовать HTTP::post, а не post_form, поскольку параметры уже преобразованы в строку.

...