Rails 4.2.4,link_to 无法使用 put 方法

Rails 4.2.4, link_to not working with put method

我有两个 links(赞成票和反对票),方法是这样

<%= link_to 'upvote', comment_upvote_path(comment), method: :put, remote: true, id: "comment_upvote_link" %>
<%= link_to 'downvote', comment_downvote_path(comment), mthod: :put, remote: true, id: "comment_downvote_link" %>

这是我的这两个 links

的路由文件
put '/comment/upvote/:id' => "comments#upvote", as: 'comment_upvote'
put '/comment/downvote/:id' => "comments#downvote", as: 'comment_downvote'

并在评论控制器中(使用 acts_as_commentable_with_threading gem 进行评论)

class CommentsController < ApplicationController

before_action :authenticate_user!

def create
 commentable = commentable_type.constantize.find(commentable_id)
 @comment = Comment.build_from(commentable, current_user.id, body)
 if @comment.save
   make_child_comment
   redirect_to(:back, :notice => 'Comment was successfully added.')
 else
   redirect_to :back
 end
end

def upvote
 @comment = Comment.find(params[:id])
 current_user.up_votes @comment
 respond_to do |format|
   format.html { redirect_to Post.find(@comment.commentable_id) }
   format.js { render 'comments/votes/upvote' }
 end
end

def downvote
 @comment = Comment.find(params[:id])
 current_user.down_votes @comment
 respond_to do |format|
   format.html { redirect_to Post.find(@comment.commentable_id) }
   format.js { render 'comments/votes/downvote' }
 end
end

private

def comment_params
  params.require(:comment).permit(:body, :commentable_id, :commentable_type, :comment_id)
end

def commentable_type
  comment_params[:commentable_type]
end

def commentable_id
  comment_params[:commentable_id]
end

def comment_id
  comment_params[:comment_id]
end

def body
  comment_params[:body]
end

def make_child_comment
  return "" if comment_id.blank?
  parent_comment = Comment.find comment_id
  @comment.move_to_child_of(parent_comment)
end
end

评论模型

class Comment < ActiveRecord::Base
default_scope -> { order(created_at: :desc)}
acts_as_nested_set :scope => [:commentable_id, :commentable_type]

validates :body, :presence => true
validates :user, :presence => true

acts_as_votable

belongs_to :commentable, :polymorphic => true

# NOTE: Comments belong to a user
belongs_to :user

def score
 self.get_upvotes.size - self.get_downvotes.size
end

def self.build_from(obj, user_id, comment)
 new \
   :commentable => obj,
   :body        => comment,
   :user_id     => user_id
end

#helper method to check if a comment has children
def has_children?
 self.children.any?
end

# Helper class method to lookup all comments assigned
# to all commentable types for a given user.
scope :find_comments_by_user, lambda { |user|
 where(:user_id => user.id).order('created_at DESC')
}

# Helper class method to look up all comments for
# commentable class name and commentable id.
scope :find_comments_for_commentable, lambda { |commentable_str, commentable_id|
 where(:commentable_type => commentable_str.to_s, :commentable_id => commentable_id).order('created_at DESC')
 }

# Helper class method to look up a commentable object
# given the commentable class name and id
def self.find_commentable(commentable_str, commentable_id)
 commentable_str.constantize.find(commentable_id)
end
end

记录赞成票

Started PUT "/comment/upvote/13" for ::1 at 2015-12-27 04:12:12 +0500
Processing by CommentsController#upvote as JS
Parameters: {"id"=>"13"}
[1m[35mUser Load (0.0ms)[0m  SELECT  `users`.* FROM `users` WHERE `users`.`id` = 1  ORDER BY `users`.`id` ASC LIMIT 1
[1m[36mComment Load (0.0ms)[0m  [1mSELECT  `comments`.* FROM `comments` WHERE `comments`.`id` = 13  ORDER BY `comments`.`created_at` DESC LIMIT 1[0m
[1m[35m (0.0ms)[0m  SELECT COUNT(*) FROM `votes` WHERE `votes`.`votable_id` = 13 AND `votes`.`votable_type` = 'Comment' AND `votes`.`voter_id` = 1 AND `votes`.`voter_type` = 'User' AND `votes`.`vote_scope` IS NULL
[1m[35m (0.0ms)[0m  SELECT COUNT(*) FROM `votes` WHERE `votes`.`votable_id` = 13 AND `votes`.`votable_type` = 'Comment' AND `votes`.`voter_id` = 1 AND `votes`.`voter_type` = 'User' AND `votes`.`vote_scope` IS NULL
[1m[35m (0.0ms)[0m  BEGIN
[1m[36m (0.0ms)[0m  [1mCOMMIT[0m
[1m[35m (0.0ms)[0m  SELECT COUNT(*) FROM `votes` WHERE `votes`.`votable_id` = 13 AND `votes`.`votable_type` = 'Comment' AND `votes`.`vote_flag` = 1 AND `votes`.`vote_scope` IS NULL
[1m[35m (0.0ms)[0m  SELECT COUNT(*) FROM `votes` WHERE `votes`.`votable_id` = 13 AND `votes`.`votable_type` = 'Comment' AND `votes`.`vote_flag` = 1 AND `votes`.`vote_scope` IS NULL
[1m[36m (0.0ms)[0m  [1mSELECT COUNT(*) FROM `votes` WHERE `votes`.`votable_id` = 13 AND `votes`.`votable_type` = 'Comment' AND `votes`.`vote_flag` = 0 AND `votes`.`vote_scope` IS NULL[0m
Rendered comments/votes/upvote.js.erb (5.0ms)
Completed 200 OK in 25ms (Views: 15.0ms | ActiveRecord: 0.0ms)

反对投票记录

Started GET "/comment/downvote/13" for ::1 at 2015-12-27 04:12:34 +0500

ActionController::RoutingError (No route matches [GET] "/comment/downvote/13"):
actionpack (4.2.4) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
web-console (2.2.1) lib/web_console/middleware.rb:39:in `call'
actionpack (4.2.4) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
railties (4.2.4) lib/rails/rack/logger.rb:38:in `call_app'
railties (4.2.4) lib/rails/rack/logger.rb:20:in `block in call'
activesupport (4.2.4) lib/active_support/tagged_logging.rb:68:in `block in tagged'
activesupport (4.2.4) lib/active_support/tagged_logging.rb:26:in `tagged'
activesupport (4.2.4) lib/active_support/tagged_logging.rb:68:in `tagged'
railties (4.2.4) lib/rails/rack/logger.rb:20:in `call'
actionpack (4.2.4) lib/action_dispatch/middleware/request_id.rb:21:in `call'
rack (1.6.4) lib/rack/methodoverride.rb:22:in `call'
rack (1.6.4) lib/rack/runtime.rb:18:in `call'
activesupport (4.2.4) lib/active_support/cache/strategy/local_cache_middleware.rb:28:in `call'
rack (1.6.4) lib/rack/lock.rb:17:in `call'
actionpack (4.2.4) lib/action_dispatch/middleware/static.rb:116:in `call'
rack (1.6.4) lib/rack/sendfile.rb:113:in `call'
railties (4.2.4) lib/rails/engine.rb:518:in `call'
railties (4.2.4) lib/rails/application.rb:165:in `call'
rack (1.6.4) lib/rack/content_length.rb:15:in `call'
puma (2.15.3) lib/puma/server.rb:541:in `handle_request'
puma (2.15.3) lib/puma/server.rb:388:in `process_client'
puma (2.15.3) lib/puma/server.rb:270:in `block in run'
puma (2.15.3) lib/puma/thread_pool.rb:106:in `call'
puma (2.15.3) lib/puma/thread_pool.rb:106:in `block in spawn_thread'

Rendered C:/RailsInstaller/Ruby2.1.0/lib/ruby/gems/2.1.0/gems/actionpack-4.2.4/lib/action_dispatch/middleware/templates/rescues/_trace.text.erb (5.0ms)
Rendered C:/RailsInstaller/Ruby2.1.0/lib/ruby/gems/2.1.0/gems/actionpack-4.2.4/lib/action_dispatch/middleware/templates/rescues/routing_error.text.erb (25.0ms)
Rendered C:/RailsInstaller/Ruby2.1.0/lib/ruby/gems/2.1.0/gems/web-console-2.2.1/lib/web_console/templates/_markup.html.erb (0.0ms)
Rendered C:/RailsInstaller/Ruby2.1.0/lib/ruby/gems/2.1.0/gems/web-console-2.2.1/lib/web_console/templates/_inner_console_markup.html.erb within layouts/inlined_string (0.0ms)
Rendered C:/RailsInstaller/Ruby2.1.0/lib/ruby/gems/2.1.0/gems/web-console-2.2.1/lib/web_console/templates/_prompt_box_markup.html.erb within layouts/inlined_string (0.0ms)
Rendered C:/RailsInstaller/Ruby2.1.0/lib/ruby/gems/2.1.0/gems/web-console-2.2.1/lib/web_console/templates/style.css.erb within layouts/inlined_string (0.0ms)
Rendered C:/RailsInstaller/Ruby2.1.0/lib/ruby/gems/2.1.0/gems/web-console-2.2.1/lib/web_console/templates/console.js.erb within layouts/javascript (60.0ms)
Rendered C:/RailsInstaller/Ruby2.1.0/lib/ruby/gems/2.1.0/gems/web-console-2.2.1/lib/web_console/templates/main.js.erb within layouts/javascript (0.0ms)
Rendered C:/RailsInstaller/Ruby2.1.0/lib/ruby/gems/2.1.0/gems/web-console-2.2.1/lib/web_console/templates/error_page.js.erb within layouts/javascript (0.0ms)
Rendered C:/RailsInstaller/Ruby2.1.0/lib/ruby/gems/2.1.0/gems/web-console-2.2.1/lib/web_console/templates/index.html.erb (130.0ms)

在浏览器中

<a id="comment_upvote_link" data-remote="true" rel="nofollow" data-method="put" href="/comment/upvote/13">upvoted</a>
<a mthod="put" id="comment_downvote_link" data-remote="true" href="/comment/downvote/13">downvote</a>

问题是赞成票 link 有效但反对票无效(甚至没有显示任何类型的错误),但是如果我更改反对票请求方法以像这样进入路由文件

get '/comment/downvote/:id' => "comments#downvote", as: 'comment_downvote'

然后就可以了。我不知道这里有什么问题,如果 downvote 不起作用那么 upvote 也不应该工作,因为它们都是相同的,我尝试用调试器调试它但是似乎 downvote 与 put 方法控制不会进入 downvote 行动它只是什么都不做。

任何帮助将不胜感激。

你的反对意见有错别字link:

<%= link_to 'downvote', comment_downvote_path(comment), mthod: :put, remote: true, id: "comment_downvote_link" %>

方法 -> 方法