我一直在寻找这个小问题,现在我想应该寻求帮助。当我点击链接时,我收到当前错误“没有路线匹配[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
您需要的任何其他内容请告诉我。
提前致谢
答案 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)
// = require jquery_ujs
您的浏览器是否已过时?
你能检查一下这个链接,看看你的锚是否有data-method='put'
?
您可以尝试使用数据:{method :: put}来判断这是否适用于您的情况?
这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
的答案解释得非常好。