我是铁轨上的红宝石初学者。我正在建立一个电影评论应用程序,用于在铁轨上练习红宝石。在该应用程序中,我正在为电影添加投票功能(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;}
答案 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