2015-04-20 29 views
1

自定义操作export_file在routes.rb中定义:Rails - 动作和http动词必须匹配吗?

resource :payment_requests do 
     collection do 
     get :export_file 
     end 
    end 

form_tag,我们可以使用method: put为export_file即使export_fileget

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

看来OK根据HTTP文件使用put方法get行动。

回答

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请求,并有轨匹配一个特定的控制器和行动,那么你应该将它指定你routes.rb文件put请求。

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

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

如果你读section 3.7,你会看到,你可以使用关键字matchvia属性限制哪些动词路线应该对阵一起。像这样的:

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

你可以使用路由这样的匹配对阵双方GETPUT如果你需要它。

+0

感谢您的回答! '但是,如果你在你的routes.rb文件中指定了一个路由作为get请求,它将只使用HTTP GET动词匹配它。“ - 这是否意味着该动作(在routes.rb中声明为”get“ )将始终用http GET完成,无论在'method:'中如何? – user938363

+0

如果routes.rb和method中的操作不匹配,则rails路由将无法正确完成。这是我们在测试中发现的。所以在实际中,它们应该匹配。 – user938363

+0

我认为你有点混淆事情。控制器中的“操作”可以有你喜欢的任何名称。你的情况是'export_file'。由于您使用'get'关键字定义了该路线,因此如果请求是“GET”请求,则Rails将仅匹配它。 – Jon