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- 开始只有 assetsviews 不包含在该模式中。

在您的 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'

然后:捆绑,重新加载服务器并再次测试。