简单的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,但是。
请不要过于严厉地评判我...答案 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
之前和之后,你可以看到添加了什么。希望这会有所帮助。