RailsはRESTの理想を追求してDELETE, PUTなどのメソッドを選択できる。path生成時に
<%= link_to "ログアウト", destroy_user_session_path, :method => :delete %>
などとできる。ところがこのとき
config/routes.rb
devise_scope :user do
get 'sign_out', :to => 'users/sessions#destroy', :as => :destroy_user_session
end
としていると、 No route matches [DELETE] "/sign_out" と言われてしまう。これは"get"と、HTTPメソッドを最初に指定してしまっているためだ。
そこでメソッドにかかわらずマッチする"match"を使う。
config/routes.rb
devise_scope :user do
match 'sign_out', :to => 'users/sessions#destroy', :as => :destroy_user_session, :via => [:get, :delete]
end
viaでメソッドを指定してやる。この使い方は、こういった具合に
match "/subscription" => 'subscribe#verify', :via => [:get,:post]
同じパスでGET/POST両方受け付ける時にも利用できる。上記はFacebook real-time update APIのendpointをこちらのRailsアプリに用意する時の例である。