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

时间:2014-02-28 05:22:51

标签: ruby-on-rails ruby ruby-on-rails-3

好的,所以我正在尝试在Ruby on rails上创建一个reddit样式页面,用户可以在其中提交链接,然后对它们进行upvote / downvote。我为链接生成了一个脚手架,它基本上像博客教程一样工作,然后自定义编写了一个迁移,将一个vote_count:整数列添加到链接表中。然后我进入控制器一个额外的upvote方法(增加links.vote_count)和downvote(减少links.vote_count)和index.erb.html页面,它显示我想要吱吱叫“link_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

index.html.erb的相关部分

<tbody>
    <% @links.each do |link| %>
      <tr>
        <td><%= link.vote_count %></td>
        <td><%= link_to 'Up', upvote_links_path(link) %></td>
        <td><%= link_to 'Down', downvote_links_path(link) %></td>
        <td><%= link.title %></td>
        <td><%= link.url %></td>
        <td><%= link.user_id %></td>
        <td><%= link_to 'Show', link %></td>
        <td><%= link_to 'Edit', edit_link_path(link) %></td>
        <td><%= link_to 'Destroy', link, method: :delete, data: { confirm: 'Are you sure?' } %></td>
      </tr>
    <% end %>
  </tbody>
</table>

的routes.rb

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

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

1 个答案:

答案 0 :(得分:0)

问题出在您的路线上。由于upvote和downvote方法将作用于链接,因此您需要使用成员而不是集合。

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