如何在同一个Rails控制器操作中处理多个HTTP方法

Kev*_*ang 39 ruby-on-rails

假设我想在同一个URL上同时支持GET和POST方法.我将如何处理rails控制器动作?

Jes*_*ott 68

您可以使用request.post检查它是否是帖子?

if request.post?
  #handle posts
else
  #handle gets
end
Run Code Online (Sandbox Code Playgroud)

让你的路线工作:

resources :photos do
  member do
    get 'preview'
    post 'preview'
  end
end
Run Code Online (Sandbox Code Playgroud)

  • @FelipeAlmeida我们可以在Rails默认的资源路由中看到这一点.`#show`,`#update`和`#destroy`都分别使用`/ models /:id`和`GET`,`PATCH`和`DELETE`.与`#index`和`#create`相同 (3认同)
  • 很抱歉要把它挖出来但是 - 两个动词共用同一条路线是不是一个坏习惯? (2认同)

Den*_*nis 7

这是另一种方式.我包含了示例代码,用于响应不支持的方法405,并在URL上使用OPTIONS方法时显示支持的方法.

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
Run Code Online (Sandbox Code Playgroud)

config/routes.rb

match '/foo/bar', to: 'foo/bar#my_action', via: :all
Run Code Online (Sandbox Code Playgroud)


jac*_*614 5

只需要使用它,只在相同的路线上使用get和post

resources :articles do
  member do
    match 'action_do-you_want', via: [:get, :post]
  end
end
Run Code Online (Sandbox Code Playgroud)