Rails - 做动作和http动词必须匹配?

时间:2015-04-20 03:54:10

标签: ruby-on-rails

自定义操作export_file在routes.rb中定义:

   resource :payment_requests do
      collection do
        get :export_file
      end
   end

form_tag中,即使method: putexport_file,我们也可以将get用于export_file吗?

<%= form_tag export_file_payment_requests_path(format: 'csv'), method: :put do %>
   ......
  <%= submit_tag 'CSV' %>
<% end %>

根据http文档,使用put方法进行get操作似乎没问题。

1 个答案:

答案 0 :(得分:1)

基本上,是的,没关系 - 您绝对可以从Rails中的表单发送PUT请求。

但是,如果您将routes.rb文件中的路由指定为get请求,则只会使用HTTP GET动词将其匹配。

查看rake routes的输出:

               Prefix Verb     URI Pattern                                                                  Controller#Action
 api_v1_search_simple GET      /api/v1/search/simple(.:format)                                              api/v1/search#simple
     new_user_session GET      /auth/login(.:format)                                                        devise/sessions#new
         user_session POST     /auth/login(.:format)                                                        devise/sessions#create
 destroy_user_session DELETE   /auth/logout(.:format)                                                       devise/sessions#destroy
        user_password POST     /auth/password(.:format)                                                     devise/passwords#create
    new_user_password GET      /auth/password/new(.:format)                                                 devise/passwords#new
   edit_user_password GET      /auth/password/edit(.:format)                                                devise/passwords#edit
                      PATCH    /auth/password(.:format)                                                     devise/passwords#update
                      PUT      /auth/password(.:format)                                                     devise/passwords#update
    user_confirmation POST     /auth/confirmation(.:format)                                                 devise/confirmations#create
new_user_confirmation GET      /auth/confirmation/new(.:format)                                             devise/confirmations#new
                      GET      /auth/confirmation(.:format)                                                 devise/confirmations#show
                 root GET      /                                                                            dashboards#show

您看到它如何列出与之匹配的Verb

如果您要发送PUT请求并使其与特定控制器和操作匹配,则应在put文件中将其指定为routes.rb请求。< / p>

您可以选择使用match通配符来定义路由,但这通常被认为是一件坏事,因为它会打开您的应用程序以进行滥用。

本指南非常有用:http://guides.rubyonrails.org/routing.html

如果您阅读section 3.7,则会发现您可以使用match关键字和via属性来限制您的路线应匹配的动词。比如这个:

match 'photos', to: 'photos#show', via: [:get, :post]

如果需要,您可以使用类似的路线与GETPUT进行匹配。