Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RubyonRails:链接更新数据库_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails RubyonRails:链接更新数据库

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

简单的RoR问题…我正在学习RoR并制作一个简单的投票应用程序。候选人列在一个表格中,在其姓名旁边有向上投票/向下投票链接。我正试图让它所有的用户所做的就是点击链接,选票计数被更新,他们被重定向到初始页面。我没有使用脚手架。出于某种原因,此操作没有达到我想要的效果:

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”来查看您的路由如何布置以调试这类事情。