【问题标题】:How do you use a Rails 3 gem method to update a database model?如何使用 Rails 3 gem 方法更新数据库模型?
【发布时间】:2024-01-03 01:24:01
【问题描述】:

我正在为 ruby​​ on rails 使用 Thumb_Up gem。 https://github.com/brady8/thumbs_up

我希望用户能够对帖子进行投票。 但是,我无法弄清楚如何允许用户单击每个帖子旁边的按钮并向数据库添加投票。

我可以通过执行以下操作在 Rails 控制台中实现这一点:

u=User.first

m=Micropost.first

u.vote_for(m)

但是,如何在视图中单击按钮时发生这种情况。我假设我必须使用 ajax,但我怎么知道我需要发布到哪个 url 才能执行此操作?

任何帮助将不胜感激。

更新:

非常感谢您的帮助!我仍然对下面的代码有问题。

这是我的路线.rb

resources :microposts do
  post :vote, :on => :member
end

查看:

<%= link_to('vote for this post!', vote_micropost_path(@micropost), :method => :post) %>

控制器:

def vote
    @micropost = Micropost.find(params[:id])
  current_user.vote_for @micropost

  # This assumes you'll only call it via AJAX.
  # If your ajax call doesn't return "ok", then you know something went wrong
  render :text => 'ok', :layout => false
end

但是,我仍然收到此错误: 没有路线匹配 {:controller=>"microposts", :id=>#, :action=>"vote"}

有人知道为什么路线匹配不正确吗?

【问题讨论】:

  • 是的,这更清楚了。在您看来,@micropost 实际上并未设置为 Micropost 记录。无论渲染该视图的什么动作都需要设置@micropost,就像 vote 动作正在做的那样。

标签: ruby-on-rails rubygems gem vote-up-buttons


【解决方案1】:

我假设 Rails 3。Rails 2 的路线看起来会有些不同。

首先,您需要在 config/routes.rb 文件中定义一个路由。你可以通过多种方式做到这一点。如果你已经有微博的路由,你可以简单地添加一个“投票”动作:

    resources :microposts do
      post :vote, :on => :member
    end

(为清楚起见,上面的“post”指的是 HTTP POST 方法,与您的 Micropost 类无关。)如果您使用该路由,则需要在 Microposts 控制器中创建一个“投票”方法抓住它。类似的东西

    def vote
      @post = Micropost.find(params[:id])
      current_user.vote_for @post

      # This assumes you'll only call it via AJAX.
      # If your ajax call doesn't return "ok", then you know something went wrong
      render :text => 'ok', :layout => false
    end

然后在您视图的 AJAX POST 调用中(假设我给出的示例路由),您将获得以下网址:

    vote_micropost_path(@micropost)

看起来像 /microposts/56/vote

【讨论】:

  • 在我看来,我正在使用这个 link_to:bold** :post) % > **粗体。我不断收到此错误 No route matches {:controller=>"microposts", :id=>#, :action=>"vote"} 这也是我用于路由的内容:resources :microposts, :only => [:create, :destroy] 做post :vote, :on => :member end 非常感谢您的帮助。
  • 您的路线看起来不错。我假设 @micropost 设置为您要投票的 Micropost 对象?因为它看起来像是一个全新的 Micropost 对象,实际上并不在数据库中。
  • 我在控制器中使用了这个来获取当前的微博。 @micropost = Micropost.find(params[:id]) 我需要以某种方式传入被点击的那个的 id 吗?你怎么能做这样的事情,或者有更简单的技巧。
  • 我不确定我是否遵循。您的控制器中的代码在哪里 - 在“投票”操作中或在显示您的微帖子投票按钮的操作中?网址会是什么样子?
  • 我正在尝试复制您的做法。我用我使用的代码和位置更新了我上面的帖子。我将 @micropost = Micropost.find(params[:id]) 放入“投票”操作中。我把它放在视图中:。很抱歉不清楚。我更新的帖子应该让这更容易。再次感谢!