Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.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_Ruby On Rails 3 - Fatal编程技术网

Ruby on rails 通过控制器方法更新表中的值

Ruby on rails 通过控制器方法更新表中的值,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,好的,我正在尝试在RubyonRails中创建一个reddit风格的页面,用户可以提交链接,然后向上/向下投票。我为链接生成了一个脚手架,基本上与博客教程类似,然后自定义编写了一个迁移,在links表中添加一个vote_count:integer列。然后,我进入控制器,添加了upvote(增加links.vote\u count)和downvote(减少links.vote\u count)方法,并在index.erb.html页面上显示了我想要的所有链接,其中显示了一个调用这些方法的“link

好的,我正在尝试在RubyonRails中创建一个reddit风格的页面,用户可以提交链接,然后向上/向下投票。我为链接生成了一个脚手架,基本上与博客教程类似,然后自定义编写了一个迁移,在links表中添加一个vote_count:integer列。然后,我进入控制器,添加了upvote(增加links.vote\u count)和downvote(减少links.vote\u count)方法,并在index.erb.html页面上显示了我想要的所有链接,其中显示了一个调用这些方法的“link\u to”按钮。虽然我得到了一个错误,但我现在拥有的东西是:找不到没有ID的链接

links_controller.rb的相关部分

class LinksController < ApplicationController
  before_action :set_link, only: [:show, :edit, :update, :destroy]

  # GET /links
  # GET /links.json
  def index
    @links = Link.all
  end

  def upvote
    @link = Link.find(params[:id])
    @link.vote_count += 1
  end

  def downvote
    @link = Link.find(params[:id])
    @link.vote_count -= 1
  end

是否有更简单的方法更新此表值,或者我做错了什么?

问题在于您的路由。由于upvote和downvote方法将作用于链接,因此您需要使用member而不是collection

resources :links do
  member do
    get :upvote
    get :downvote
  end
end

因为我对rails比较陌生,你能解释一下成员和集合之间的区别吗?当然。将收集视为您希望执行的所有链接操作。例如,如果要添加搜索功能。您可以这样做:
collection-do;获取:搜索;结束
。这样,您将获得如下url:
/links/search
。如果要引用特定链接,则需要使用成员。成员内部的所有操作,获取传入的ID。因此,对于您的情况,您的url应该是
/links/ID/upvote
。然后你可以参考哪个链接需要被升级。这很有意义。我已将路由更改为member,但仍然收到错误“upvote\u links\u path上的未定义方法”。为了解决这个问题,我调整了相应的upvote\u link\u路径(no s),因为这是更改为member所做的,但是现在我得到了一个错误,页面/links/upvote没有定义模板,但我不希望它重定向到页面,我只希望它调用操作upvote并停留在当前页面上。接下来我需要做什么?
resources :links do
    collection do
      get :upvote
      get :downvote
    end
  end
resources :links do
  member do
    get :upvote
    get :downvote
  end
end