Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 单击链接不会触发该操作_Ruby On Rails_Ruby_Routing - Fatal编程技术网

Ruby on rails 单击链接不会触发该操作

Ruby on rails 单击链接不会触发该操作,ruby-on-rails,ruby,routing,Ruby On Rails,Ruby,Routing,我是RubyonRails的初学者。我正在为练习ruby on rails构建一个电影评论应用程序。在该应用程序中,我为电影添加了投票功能(upvote和downvote) 电影索引 当我点击upvote和downvote(电影#索引)链接时,upvote和downvote操作不会触发。这是投掷错误 没有路由匹配{:action=>“upvote”,:controller=>“votes”} 您的“vows\u controller.rb”已定义MoviesController。是打字错误吗 您

我是RubyonRails的初学者。我正在为练习ruby on rails构建一个电影评论应用程序。在该应用程序中,我为电影添加了投票功能(upvote和downvote)

电影索引

当我点击upvote和downvote(电影#索引)链接时,upvote和downvote操作不会触发。这是投掷错误

没有路由匹配{:action=>“upvote”,:controller=>“votes”}

您的“vows\u controller.rb”已定义MoviesController。是打字错误吗

您还需要定义自定义资源路由。有关在rails中布线的更多信息,请参见

我还建议您创建一个投票模型以供使用

resources :votes
投票模式将包括: id:int 类型:字符串 电影编号:int

鉴于:

link_to 'Upvote', vote_path(movie_id: movie.id, type: 'up'), method: post
link_to 'Downvote', vote_path(movie_id: 42, type: 'down'), method: post
我可能误解了自动生成路径的方法;要查看应用程序中的所有可用路由,请打开终端,导航到rails根文件夹并运行: 耙道


以上链接解释了所有内容

我建议仅对电影使用资源定义,此外,对电影使用两条向上投票和向下投票路线:

Rails.application.routes.draw do
  resources :votes do
    member do
      get 'upvote'
      get 'downvote'
    end
  end
end
如果您运行
rake routes
,现在您可以获得一个不错的路由列表来管理您的电影,此外还有另外两个路由。在一个控制器的不同操作中处理所有路径

~/dev/rubyonrails/test_app$rake routes
        Prefix Verb   URI Pattern                    Controller#Action 
  upvote_movie GET    /movies/:id/upvote(.:format)   movies#upvote
downvote_movie GET    /movies/:id/downvote(.:format) movies#downvote
        movies GET    /movies(.:format)              movies#index
               POST   /movies(.:format)              movies#create
     new_movie GET    /movies/new(.:format)          movies#new
    edit_movie GET    /movies/:id/edit(.:format)     movies#edit
         movie GET    /movies/:id(.:format)          movies#show
               PATCH  /movies/:id(.:format)          movies#update
               PUT    /movies/:id(.:format)          movies#update
               DELETE /movies/:id(.:format)          movies#destroy
~/dev/rubyonrails/test_app$
现在,您可以使用路由帮助器(请参见列表中的前缀):


movie
对象在路由路径中带来了
:id
属性,因此您知道应该向上或向下投票哪个电影


注意路由器助手名称的单词。这些听起来像是您想要执行的操作:向上投票电影或向下投票电影

向上投票
不是默认定义的操作。您需要手动声明它,或者改用
create
。我不使用acts\u as\u votable。我用:upvote和:downvote列生成了投票模型,我不确定这有什么关系
resources
声明了通常的REST操作,而
upvote
不是其中之一。如何使用链接中的url触发upvote操作?谢谢:)我现在意识到你没有为自定义操作定义路由。这是因为你在定义链接时没有传递任何参数。更新答案哦,谢谢,我可以按照您的格式查看路线名称。我可以通过link传递参数吗?让我们。
link_to 'Upvote', vote_path(movie_id: movie.id, type: 'up'), method: post
link_to 'Downvote', vote_path(movie_id: 42, type: 'down'), method: post
Rails.application.routes.draw do
  resources :votes do
    member do
      get 'upvote'
      get 'downvote'
    end
  end
end
~/dev/rubyonrails/test_app$rake routes
        Prefix Verb   URI Pattern                    Controller#Action 
  upvote_movie GET    /movies/:id/upvote(.:format)   movies#upvote
downvote_movie GET    /movies/:id/downvote(.:format) movies#downvote
        movies GET    /movies(.:format)              movies#index
               POST   /movies(.:format)              movies#create
     new_movie GET    /movies/new(.:format)          movies#new
    edit_movie GET    /movies/:id/edit(.:format)     movies#edit
         movie GET    /movies/:id(.:format)          movies#show
               PATCH  /movies/:id(.:format)          movies#update
               PUT    /movies/:id(.:format)          movies#update
               DELETE /movies/:id(.:format)          movies#destroy
~/dev/rubyonrails/test_app$
<%= link_to "upvote", upvote_movie_path(movie) %>
<%= link_to "down vote", downvote_movie_path(movie) %>