Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails-动作和http动词必须匹配吗?_Ruby On Rails - Fatal编程技术网

Ruby on rails Rails-动作和http动词必须匹配吗?

Ruby on rails Rails-动作和http动词必须匹配吗?,ruby-on-rails,Ruby On Rails,routes.rb中定义了自定义操作导出文件: resource :payment_requests do collection do get :export_file end end 在表单标签中,即使导出文件是获取,我们是否可以使用方法:put导出文件 <%= form_tag export_file_payment_requests_path(format: 'csv'), method: :put do %> ...

routes.rb中定义了自定义操作导出文件:

   resource :payment_requests do
      collection do
        get :export_file
      end
   end
表单标签
中,即使
导出文件
获取
,我们是否可以使用
方法:put
导出文件

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

......

根据http文档,似乎可以使用
put
方法执行
get
操作

基本上,是的,这很好-您完全可以从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
您看到它如何列出它将匹配的
动词了吗

如果您希望发送一个
PUT
请求,并让rails将其与特定控制器和操作相匹配,那么您应该在
routes.rb
文件中将其指定为
PUT
请求

您可以选择使用
匹配
通配符来定义路由,但这通常被认为是一件坏事,因为它会导致应用程序被误用

本指南非常有用:

如果您阅读,您将看到您可以使用
match
关键字以及
via
属性来限制您的路线应该匹配哪些动词。例如:

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

如果需要,您可以使用这样的路线来匹配
GET
PUT

谢谢您的回答
但是,如果您在routes.rb文件中指定一个路由作为get请求,它将只使用HTTP get动词匹配它。
-这是否意味着操作(在routes.rb中声明为
get
)将始终使用HTTP get来完成,无论在
方法:
中执行什么操作?如果routes.rb中的操作与方法:不匹配,那么,rails路由将无法正确完成。这是我们在测试中发现的。所以在实际中,它们应该是匹配的。我想你有点混淆了。控制器中的
操作
可以有您喜欢的任何名称。在您的情况下,它是
导出\u文件
。因为您使用
get
关键字定义该路由,所以Rails将仅在请求是
get
请求时匹配它。