Ruby on Rails:链接更新DB

时间:2009-05-08 05:14:55

标签: ruby-on-rails ruby

简单的RoR问题......我正在学习ROR并正在制作一个简单的投票应用程序。候选人列在表格中,并在他们的名字旁边有upvote / downvote链接。我试图让它成为所有用户所做的就是点击链接,更新投票计数,并将它们重定向到初始页面。我不是在使用脚手架。出于某种原因,这个动作没有做任何接近我想要的事情:

def upvote
  @name = Name.find(params[:id])
  @name[:votes] += 1
  respond_to do |format|
    if @name.update_attributes(params[:name])
      flash[:notice] = 'Candidate was upvoted'
      format.html = { redirect_to :action => "index" }
      format.xml = { head :ok }
    else
      format.html = { render :action => "index" }
      format.xml = { render :xml => @name.errors, :status => :unprocessable_entity }
    end
  end
end

我确实在视图中有调用正确动作的链接,它正试图调用:show,但是。

请不要过于严厉地评判我...

2 个答案:

答案 0 :(得分:4)

update_attributes方法通常用于从表单POST设置ActiveRecord对象的字段。这些字段可以作为哈希params[:name]找到,例如params[:name][:votes]

如果您点击链接来调用upvote方法,那么您只是在执行GET请求。您需要做的就是致电@name.save保存记录。

def upvote
  @name = Name.find(params[:id])
  @name[:votes] += 1
  respond_to do |format|
    if @name.save
      flash[:notice] = 'Candidate was upvoted'
      format.html = { redirect_to :action => "index" }
      format.xml = { head :ok }
    else
      format.html = { render :action => "index" }
      format.xml = { render :xml => @name.errors, :status => :unprocessable_entity }
    end
  end
end

编辑:根据评论,我们还确定路线设置不当,并且视图中的link_to代码需要包含@name.id

答案 1 :(得分:3)

通常映射到show的RESTful URL是:

my_resource/id

所以,例如,

candidates/1

只是猜测,我敢打赌,如果你查看config / routes.rb,你会发现类似的东西:

map.resources :candidates

其中my_resource是控制器的名称。如果您打算使用这种路由,那么资源如何提供upvoting?在这种情况下,自定义方法似乎很明智,所以:

map.resources :candidates, :collection => { :upvote => :post }

如果你跑

rake routes | grep candidate

之前和之后,你可以看到添加了什么。希望这会有所帮助。