rails 5 路由,PUT 动作以 GET 结束
rails 5 routing, PUT action winds up as GET
使用acts_as_votablegem到upvote/downvote一个"skill",
rails 5.0.0 应用
routes.rb:
resources :skills do
member do
patch "upvote", to: "skills#upvote"
put "downvote", to: "skills#downvote"
end
end
技能控制器:
def upvote
@skill.upvote_from current_user
redirect_to skill_path(@skill.id)
end
def downvote
@skill.downvote_from current_user
redirect_to skill_path(@skill.id)
end
观点:
<%= link_to "Up Vote", upvote_skill_path(skill), method: :put %>
生成这个 HTML:
<a rel="nofollow" data-method="put" href="/skills/98/upvote">Up Vote</a>
但是当点击 link 时,不知何故它是一个 GET:
Started GET "/skills/98/upvote" for 192.168.0.2 at 2017-02-23 22:46:07 -0500
ActionController::RoutingError (No route matches [GET] "/skills/98/upvote"):
'rake routes' 输出看起来正确:
upvote_skill PUT /skills/:id/upvote(.:format) skills#upvote
downvote_skill PUT /skills/:id/downvote(.:format) skills#downvote
我不知所措..我唯一能想到的是这个应用程序开始作为一个 API 唯一的应用程序 http://edgeguides.rubyonrails.org/api_app.html 但我很确定我已经遵循了所有转换 "regular app to API" 向后执行第 3.2 节的步骤。但也许我遗漏了什么?
Rails 使用不显眼的 javascript 来执行此类操作,可能您没有正确包含 javascript,因为您的应用以 api- 开始只有 assets
和 views
不包含在该模式中。
在您的 application.html.erb
中确保包含 javascript
<!-- app/views/layouts/application.html.erb -->
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
您 application.js 必须至少具有这些定义
// app/assets/javascripts/application.js
//= require jquery
//= require jquery_ujs
最后,Gemfile
需要
gem 'jquery-rails'
然后:捆绑,重新加载服务器并再次测试。
使用acts_as_votablegem到upvote/downvote一个"skill", rails 5.0.0 应用
routes.rb:
resources :skills do
member do
patch "upvote", to: "skills#upvote"
put "downvote", to: "skills#downvote"
end
end
技能控制器:
def upvote
@skill.upvote_from current_user
redirect_to skill_path(@skill.id)
end
def downvote
@skill.downvote_from current_user
redirect_to skill_path(@skill.id)
end
观点:
<%= link_to "Up Vote", upvote_skill_path(skill), method: :put %>
生成这个 HTML:
<a rel="nofollow" data-method="put" href="/skills/98/upvote">Up Vote</a>
但是当点击 link 时,不知何故它是一个 GET:
Started GET "/skills/98/upvote" for 192.168.0.2 at 2017-02-23 22:46:07 -0500
ActionController::RoutingError (No route matches [GET] "/skills/98/upvote"):
'rake routes' 输出看起来正确:
upvote_skill PUT /skills/:id/upvote(.:format) skills#upvote
downvote_skill PUT /skills/:id/downvote(.:format) skills#downvote
我不知所措..我唯一能想到的是这个应用程序开始作为一个 API 唯一的应用程序 http://edgeguides.rubyonrails.org/api_app.html 但我很确定我已经遵循了所有转换 "regular app to API" 向后执行第 3.2 节的步骤。但也许我遗漏了什么?
Rails 使用不显眼的 javascript 来执行此类操作,可能您没有正确包含 javascript,因为您的应用以 api- 开始只有 assets
和 views
不包含在该模式中。
在您的 application.html.erb
中确保包含 javascript
<!-- app/views/layouts/application.html.erb -->
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
您 application.js 必须至少具有这些定义
// app/assets/javascripts/application.js
//= require jquery
//= require jquery_ujs
最后,Gemfile
需要
gem 'jquery-rails'
然后:捆绑,重新加载服务器并再次测试。