Ruby on rails Rails-动作和http动词必须匹配吗?
routes.rb中定义了自定义操作导出文件: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 %> ...
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
请求时匹配它。