【问题标题】:Clicking on the link is not triggering the action单击链接不会触发操作
【发布时间】:2016-02-10 18:37:05
【问题描述】:

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

电影#index

<%= 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

当我点击链接 upvotedownvote(movies#index) 时,upvote 和 downvote动作没有触发。它正在抛出错误

没有路线匹配 {:action=>"upvote", :controller=>"votes"}

【问题讨论】:

  • upvote 不是默认定义的操作。您需要手动声明它,或者改用create
  • 我没有使用acts_as_votable。我用 :upvote 和 :downvote 列生成了投票模型
  • 我不确定这有什么关系。 resources 声明了通常的 REST 操作,upvote 不是其中之一。
  • 如何使用链接中的 url 来触发点赞操作?谢谢:)

标签: ruby-on-rails ruby routing


【解决方案1】:

您的“votes_controller.rb”已经定义了 MoviesController。是不是笔误?

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

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

resources :votes

投票模型将具有: 编号:整数 类型:字符串 movie_id: 整数

并且在视图中:

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 根文件夹并运行: 耙路线

上面的链接都有解释

【讨论】:

  • 我现在意识到您没有为自定义操作定义路由。
  • 那是因为你在定义链接时没有传递任何参数。更新答案
  • 哦,谢谢,我可以按照您的格式查看路线名称。我可以通过链接传递参数吗?
【解决方案2】:

我建议只为电影使用资源定义,另外还有两条路线来支持和反对电影:

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 属性,因此您知道应该对哪部电影投赞成票或反对票。

注意路由器助手名称的单词。这些听起来就像您想要做的那样:赞成电影或反对电影

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多