Как обрабатывать несколько методов HTTP в одном действии контроллера Rails - PullRequest
38 голосов
/ 07 апреля 2011

Допустим, я хочу поддерживать оба метода GET и POST для одного и того же URL. Как мне поступить с этим в действии контроллера рельсов?

Ответы [ 5 ]

65 голосов
/ 07 апреля 2011

Вы можете проверить, было ли это сообщение, используя request.post?

if request.post?
  #handle posts
else
  #handle gets
end

Чтобы заставить ваши маршруты работать:

resources :photos do
  member do
    get 'preview'
    post 'preview'
  end
end
6 голосов
/ 21 ноября 2014

Вот другой способ.Я включил пример кода ответа 405 для неподдерживаемых методов и отображения поддерживаемых методов при использовании метода OPTIONS в URL.

В app/controllers/foo/bar_controller.rb

before_action :verify_request_type

def my_action
  case request.method_symbol
  when :get
    ...
  when :post
    ...
  when :patch
    ...
  when :options
    # Header will contain a comma-separated list of methods that are supported for the resource.
    headers['Access-Control-Allow-Methods'] = allowed_methods.map { |sym| sym.to_s.upcase }.join(', ')
    head :ok
  end
end

private

def verify_request_type
  unless allowed_methods.include?(request.method_symbol)
    head :method_not_allowed # 405
  end
end

def allowed_methods
  %i(get post patch options)
end

В config/routes.rb

match '/foo/bar', to: 'foo/bar#my_action', via: :all
4 голосов
/ 25 июля 2016

Просто нужно использовать это, чтобы использовать только получать и отправлять по тому же маршруту

resources :articles do
  member do
    match 'action_do-you_want', via: [:get, :post]
  end
end
1 голос
/ 30 июня 2017

вы можете попробовать это

match '/posts/multiple_action', to: 'posts#multiple_action', via: [:create, :patch, :get, :options]
0 голосов
/ 24 августа 2018

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

# config/routes.rb
...
get '/my_action' => 'my#my_action_get'
post '/my_action' => 'my#my_action_post'
...

# app/controllers/my_controller.rb
...
def my_action_get
  # do stuff like listing smth
end

def my_action_post
  # do other stuff
end

Фактически, Rails по умолчанию использует ту же логику: index иДействия create вызываются запросами, отправляемыми по одним и тем же путям (например, /articles), однако они имеют разные методы запроса: GET /articles запрос перенаправляется на действие index и перечисляет все статьи, а POST /articlesперенаправляется на действие create и создает новую статью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...