没有路线匹配[GET]“/ stories / 7 / like”

时间:2015-10-24 03:14:58

标签: ruby-on-rails

我一直在寻找这个小问题,现在我想应该寻求帮助。当我点击链接时,我收到当前错误“没有路线匹配[GET]”/ stories / 7 / like“”。这是我的routes.rb,因为这似乎是问题所在:

Rails.application.routes.draw do
 devise_for :users

resources :stories do
member do
put :like, to:'stories#upvote'
put :dislike, to:'stories#downvote'
end
end 

root 'stories#index'
end

My Stories_controller是:

class StoriesController <ApplicationController
before_action :authenticate_user!, only: [:new, :create, :upvote, :downvote]

def index
@stories = Story.all
end

def new
@story = Story.new
end

def create
@story = Story.new(story_params)
@story.user = current_user
if @story.save
redirect_to @story
else
Flash[:danger] = @story.errors.full_messages.to_sentence
render new
end
end

def show
@story = Story.find(params[:id])
end

def upvote
@story = Story.find(params[:id])
@story.upvote_by(current_user)
redirect_to :back 
end

def downvote
@story = Story.find(params[:id])
@story.downvote_by(current_user)
redirect_to :back 
end


private

def story_params
params.require(:story).permit(:body)
end

end

这是按钮的代码:

<%= link_to "That scared me", like_story_path(story), method: :put, class: "btn btn-warning btn-xs" %><span class="text-warning"> (<%= story.get_upvotes.size %>)</span>
    <%= link_to "You Wimp!", dislike_story_path(story), method: :put, class: "btn btn-success btn-xs" %><span class="text-warning"> (<%= story.get_downvotes.size %>)</span>

这是我的Gemfile

source 'https://rubygems.org'


gem 'rails', '4.2.2'
gem 'sqlite3'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.1.0'
gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 2.0'

gem'devise'
gem 'bootstrap-sass', '~> 3.3.5'
gem 'bootswatch-rails'
gem 'acts_as_votable', '~> 0.10.0'

gem 'sdoc', '~> 0.4.0', group: :doc


group :development, :test do
 gem 'byebug'
 gem 'web-console', '~> 2.0'
 gem 'spring'
end

您需要的任何其他内容请告诉我。

提前致谢

3 个答案:

答案 0 :(得分:2)

检查浏览器中的控制台,很可能是因为javascript错误导致jquery_ujs阻止点击事件。

jquery_ujs侦听具有data-method属性的链接上的点击事件,并创建表单并将其发布到服务器。这个表单包含一个隐藏的_method输入,Rack接收该输入并在将请求传递给Rails之前更改请求的HTTP方法。

如果您遇到语法错误或引用错误导致jquery_ujs无法运行,请点击该链接,就会发出GET请求,就像互联网上的任何其他链接一样。

所有这一切都是因为浏览器只会在您点击链接和POST / GET表单时发送GET请求。

另一种选择是使用:

<%= button_to like_story_path(story), method: :put, class: "btn btn-warning btn-xs" do %>
That scared me <span class="text-warning"> (<%= story.get_upvotes.size %>)</span>
<% end %>
  

<强> button_to(name = nil, options = nil, html_options = nil, &block)

     

生成一个包含提交到URL的单个按钮的表单   由一组选项创建。这是最安全的方法   导致数据更改的链接不会被搜索机器人触发   或加速器。如果HTML按钮不适用于您的布局,   您还可以考虑将link_to方法与:method一起使用   link_to文档中描述的修饰符。

     

http://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-button_to

它通常与上面相同,但由于您实际上明确创建了表单,因此它不依赖于javascript。

答案 1 :(得分:0)

  1. 您是否可以检查是否在jquery下的applicaiton.js中包含以下内容?
  2. // = require jquery_ujs

    1. 您的浏览器是否已过时? 你能检查一下这个链接,看看你的锚是否有data-method='put'

    2. 您可以尝试使用数据:{method :: put}来判断这是否适用于您的情况?

    3. 这3个条件应该会给你一个解决方案。

答案 2 :(得分:0)

这里有几个问题:

#config/routes.rb
resources :stories do
   match :vote, action: :vote, via: [:put, :destroy], as: :vote #-> url.com/stories/:id/vote
end 

这与您的实现略有不同,但更为简单:

#app/controllers/stories_controller.rb
class StoriesController < ApplicationController
   def vote
      @story = Story.find params[:id]

      method = request.delete? "downvote" : "upvote"
      @story.send("#{method}_by", current_user)

      redirect_do :back
   end
end

这将在一个操作中完成所有操作,并且能够根据您发送的up/down调用method投票:

<%= link_to "Upvote", stories_vote_path(@story), method: :put %>
<%= link_to "Downvote", stories_vote_path(@story), method: :delete %>    

以上是您问题的症结所在 - 如果您没有定义路线的方法,则会发送GET请求。

  

没有路线匹配[GET]“/ stories / 7 / like”

此处的问题是您尝试使用put请求访问get路由。虽然这可能是一个无辜的问题,但如果您要发送method以外的任何其他方法, 可以在link_to中设置get

Max的答案解释得非常好。