Ruby on rails RubyonRails:链接更新数据库
简单的RoR问题…我正在学习RoR并制作一个简单的投票应用程序。候选人列在一个表格中,在其姓名旁边有向上投票/向下投票链接。我正试图让它所有的用户所做的就是点击链接,选票计数被更新,他们被重定向到初始页面。我没有使用脚手架。出于某种原因,此操作没有达到我想要的效果:Ruby on rails RubyonRails:链接更新数据库,ruby-on-rails,ruby,Ruby On Rails,Ruby,简单的RoR问题…我正在学习RoR并制作一个简单的投票应用程序。候选人列在一个表格中,在其姓名旁边有向上投票/向下投票链接。我正试图让它所有的用户所做的就是点击链接,选票计数被更新,他们被重定向到初始页面。我没有使用脚手架。出于某种原因,此操作没有达到我想要的效果: def upvote @name = Name.find(params[:id]) @name[:votes] += 1 respond_to do |format| if @name.update_attrib
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
请不要太苛刻地评判我,哈哈…通常使用
update\u attributes
方法从表单帖子设置ActiveRecord对象的字段。这些字段将作为散列params[:name]
,例如params[:name][:voces]
如果您正在单击一个链接来调用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
编辑:从评论中,我们还确定路由设置不正确,视图中指向代码的
链接需要包含@name.id
通常使用更新属性
方法从表单帖子设置ActiveRecord对象的字段。这些字段将作为散列params[:name]
,例如params[:name][:voces]
如果您正在单击一个链接来调用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
编辑:根据评论,我们还确定路由设置不正确,视图中指向
代码的链接需要包含@name.id
通常映射到显示的RESTful URL为:
my_resource/id
因此,例如
candidates/1
只是猜测一下,我敢打赌如果您查看config/routes.rb,您会发现如下内容:
map.resources :candidates
其中my_resource是控制器的名称。如果要使用这种路由,那么资源如何提供向上投票?在这种情况下,自定义方法似乎是明智的,因此:
map.resources :candidates, :collection => { :upvote => :post }
如果你跑
rake routes | grep candidate
在之前和之后,您可以看到添加了什么。希望这有帮助。通常,映射到显示的RESTful URL是:
my_resource/id
因此,例如
candidates/1
只是猜测一下,我敢打赌如果您查看config/routes.rb,您会发现如下内容:
map.resources :candidates
其中my_resource是控制器的名称。如果要使用这种路由,那么资源如何提供向上投票?在这种情况下,自定义方法似乎是明智的,因此:
map.resources :candidates, :collection => { :upvote => :post }
如果你跑
rake routes | grep candidate
在之前和之后,您可以看到添加了什么。希望这能有所帮助。它仍然没有任何作用,只是出于某种原因进入了“表演”动作……无论如何,谢谢你的帮助,我的问题一定不在控制器中……是的,我觉得表演动作被调用很奇怪。如果您还可以在用于创建链接的视图中显示代码,这将有所帮助。此外,如果您配置了任何路由,了解这些路由也会很有帮助:upvote%>/:downvote%>这是视图的相关部分,以下是路由:ActionController::Routing::routes.draw do | map | map.resources:names,:collection=>{:upvote=>:post}map.connect':controller/:action/:id'map.connect':controller/:action/:id::format'map.root:controller=>“names”在routes.rb中,您应该将upvote操作映射到GET,而不是POST:map.resources:names,:collection=>{:upvote=>:GET}。正如Steve在文章中提到的,运行“rake routes”查看您的路由如何布置以调试这类事情。它仍然不起任何作用,只是出于某种原因转到“show”操作…无论如何,感谢您的帮助,我的问题一定不在控制器中…是的,我认为调用show操作很奇怪。如果您还可以在用于创建链接的视图中显示代码,这将有所帮助。此外,如果您配置了任何路由,了解这些路由也会很有帮助:upvote%>/:downvote%>这是视图的相关部分,以下是路由:ActionController::Routing::routes.draw do | map | map.resources:names,:collection=>{:upvote=>:post}map.connect':controller/:action/:id'map.connect':controller/:action/:id::format'map.root:controller=>“names”在routes.rb中,您应该将upvote操作映射到GET,而不是POST:map.resources:names,:collection=>{:upvote=>:GET}。正如Steve在文章中提到的,运行“rake routes”来查看您的路由如何布置以调试这类事情。