没有路线匹配[GET]" / links / 1 / like" acts_as_votable

时间:2015-12-16 19:06:35

标签: ruby-on-rails routing acts-as-votable

此处的其他解决方案无效,因此我发布了一个新问题。我正在使用acts_as_votable对链接进行上下投票,但当我尝试实际投票时,我收到错误:

No route matches [GET] "/links/1/like"

这就是我的观点:

<%= link_to like_link_path(link), method: :put, class: "btn btn-default btn-sm" do %>
        <span class="glyphicon glyphicon-chevron-up"></span>
        Upvote
        <%= link.get_upvotes.size %>
      <% end %>
      <%= link_to dislike_link_path(link), method: :put, class: "btn btn-default btn-sm" do %>
        <span class="glyphicon glyphicon-chevron-down">
        Downvote
        <%= link.get_downvotes.size %>
      <% end %>

这就是我的路线:

  resources :links do
    member do
      put "like", to: "links#upvote"
      put "dislike", to: "links#downvote"
    end
  end

我看到我的客户端正在尝试访问get方法,但我在index.html.erb文件中显式调用了method: :put

你知道为什么它试图访问get以及如何覆盖它吗?

2 个答案:

答案 0 :(得分:2)

这个问题几乎总是与JQuery有关,尽管在这种情况下我不确定原因。

你甚至可以看到它here

  

请注意,如果用户禁用了JavaScript,请求将回退到使用GET

我首先会检查你的应用程序中是否有JQuery,然后它被称为okay。如果它没有加载,那么最好的做法就是看看为什么没有调用JQuery(它要么去,因为它不会被引用,或者你已经有了阻止加载的错误。

您的代码实际上看起来有效,所以我不得不说JQuery可能是这里的问题。

你可以改善你的路线等:

#config/routes.rb
resources :links do
   match "vote", action: :vote, via: [:put,:delete], on: :member
end

这会将两种类型的请求发送到名为vote的操作,然后您可以按如下方式拆分:

#app/controllers/links_controller.rb
class LinksController < ApplicationController
   def vote
      if request.put?
         # Code to vote
      elsif request.delete?
         # Code to downvote
      end
      # Redirect back
   end
end

很多DRY并且效率更高(仅调用单个动作等)

答案 1 :(得分:1)

事实证明,答案与JQuery有关。我收到Uncaught ReferenceError: jQuery is not defined错误,所以我所做的是在我的application.html.erb文件中直接包含JQuery。

你必须先把它放在所有其他脚本之前。

<script src="http://code.jquery.com/jquery-1.11.3.min.js"></script>

之后,投票开始起作用