单击该链接不会触发该操作

时间:2016-02-10 18:37:06

标签: ruby-on-rails ruby routing

我是铁轨上的红宝石初学者。我正在建立一个电影评论应用程序,用于在铁轨上练习红宝石。在该应用程序中,我正在为电影添加投票功能(upvote和downvote)。

影#索引

<%= link_to "Add movie", new_movie_path %>
  <% @movies.each do |movie| %>
    <%= image_tag movie.thumbnail.url(:medium) %>
    <%= link_to movie.title, movie_path(movie) %>
    <%= link_to "upvote", {controller: "votes", action: "upvote"} %>
    <%= link_to "downvote",{controller:"votes", action: "downvote"} %>
  <% end %>

投票控制器

class MoviesController < ApplicationController
  def upvote
    Movie.find(params[:id]).vote.upvote += 1
    redirect_to movies_path
  end

  def downvote
    Movie.find(params[:id]).vote.downvote += 1
    redirect_to movies_path
  end
end

的routes.rb

Rails.application.routes.draw do    
  resources :movies    
  resources :votes
  root 'movies#index'  
end

当我点击链接 upvote downvote (电影#index)时,upvote和downvote行动没有触发。抛出错误

  

没有路线匹配{:action =&gt;&#34; upvote&#34;,:controller =&gt;&#34;投票&#34;}

2 个答案:

答案 0 :(得分:2)

您的“votes_controller.rb”已定义MoviesController。这是一个错字吗?

您还需要定义自定义资源路由。有关路由路由的详细信息,请参阅http://guides.rubyonrails.org/routing.html

我还建议你创建一个投票模型使用

resources :votes

投票模型将具有: id:int type:string movie_id: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根文件夹并运行:      耙路线

所有内容都在上面的链接中解释

答案 1 :(得分:1)

我建议仅为电影使用资源定义,另外还有两条用于upvote和downvote电影的路线:

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$

现在您可以使用路线助手(请参阅列表中的前缀):

<%= link_to "upvote", upvote_movie_path(movie) %>
<%= link_to "down vote", downvote_movie_path(movie) %>

movie对象在路径路径中显示:id属性,因此您可以知道应该选择哪个影片进行投票。

注意路由器帮助程序名称的字样。这些听起来就像你想要做的那样:upvote movie或downvote movie