rails route.rb, почему маршрутизация настаивает на указании get, когда это всего лишь почтовый запрос?

Я создал метод API для публикации. Я указываю в route.rb, что он должен вызываться только через: post, но когда я вызываю API через браузер, он жалуется, что ему не хватает GET-маршрутов. Что не так?

class Api::XyzsController < ApiController

  # POST /api/create_xyz
  def create_xyz

    product = Product.find(params[:rpt_id])
    Xyz.create!(:product_id => product.id ,
              :status => 'open',....)

    render :json => {:message => 'Submitted.'}, :status => :ok
  end
end

маршруты.rb

...
namespace 'api' do
      match 'create_xyz' => 'xyzs#create_xyz', :via => [:post]
end 

опубликовать в браузере, http://localhost/api/create_xyz?rpt_id=123 получить ошибку:

No route matches [GET] "/api/create_xyz

сгенерированный маршрут:

api_report_xyz POST     /api/report_xyz(.:format)  {:format=>"json", :action=>"report_xyz", :controller=>"api/xyzs"}

если я добавлю переход через в route.rb, это исправит. Но я не понимаю, почему он настаивает на получении, когда это вызов метода post....


person jmsia    schedule 16.03.2012    source источник
comment
Как вы на самом деле пытаетесь отправить этот почтовый запрос?   -  person James    schedule 17.03.2012
comment
Я думаю, что здесь происходит большое недоразумение. Использование ссылки (href) или redirect_to ВСЕГДА будет запросом GET. вы ничего не можете сделать, чтобы сделать это постом. Это не ограничение рельсов. Так работают браузеры и HTTP.   -  person masukomi    schedule 05.05.2012


Ответы (2)


Опция :via не заставляет запрос становиться POST, если это GET. Он просто ограничивает входящие запросы POST-запросами. Запрос по-прежнему должен быть построен как POST.

person kclair    schedule 16.03.2012
comment
Как? то, как я указываю URL-адрес, неверно? Что я должен быть тогда? [ссылка]localhost/api/create_xyz?rpt_id=123 - person jmsia; 17.03.2012
comment
Если вы просто делаете обычную ссылку с добавленной к ней строкой запроса, это выдаст запрос GET. Чтобы сделать запрос POST, вы должны либо создать форму с method=post в качестве атрибута формы, либо, если вы используете метод rails link_to, вы можете использовать параметр :method =› :post, чтобы превратить его в POST. запрос. имейте в виду, что использование параметра :method =› :post с link_to на самом деле немного похоже на магию rails и превратит ссылку в форму. - person kclair; 17.03.2012
comment
ха, это интересно. Однако это класс контроллера API, это действие внутри контроллера, которое я вызываю. На самом деле с этим не связана никакая форма. Как вы можете видеть выше, внутри действия запрашивается параметр, вот и все. Вообще без формы. Есть ли способ применить POST в действии контроллера? - person jmsia; 17.03.2012
comment
если он запрашивает параметр, а не устанавливает параметр, почему вы хотите, чтобы это был POST? - person kclair; 17.03.2012

Настройка :via => :post в вашем файле маршрутов просто означает, что есть только маршрут POST, никаких других.

Он не контролирует, что люди пытаются отправить в ваше приложение. Однако это означает, что если кто-то отправит запрос GET, ваше приложение скажет «нет маршрута», потому что у вас есть только маршрут POST.

Я понимаю, что у вас нет связанного представления и что это для API, но, как бы вы ни тестировали, это отправляет запрос GET. Тип поступающего запроса определяется отправителем запроса, а не вашим приложением (при условии, что он поступает извне). Измените способ тестирования или способ отправки запроса отправителем, чтобы он был POST, и ваша проблема исчезнет.

person Joel Friedlaender    schedule 17.03.2012