微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Rails控制器更新方法仅适用于一个调用,然后失败?

如何解决Rails控制器更新方法仅适用于一个调用,然后失败?

| 我有一个简单的网址,它将在我的搜索模型中切换一个字段。 (锁定)我想通过单击链接来切换此字段。 例:
http://localhost:3000/search/toggle/fe5c72164908af20a7727f324e2fdbc1
链接对于一个呼叫而言工作正常,然后出现以下错误
undefined method `locked\' for nil:NilClass
切换路径仅指向搜索更新方法: 路线:
map.connect \'search/toggle/:id\',:controller => \'searches\',:action => \'update\'
更新动作如下所示:
  def update

   @search = Search.find_by_permalink(params[:id])

   if @search.locked == 1 then 
     @search.locked = 0 
   else 
     @search.locked = 1
    end 

    respond_to do |format|
      if @search.update_attributes(params[:search])
        flash[:notice] = \'Search was successfully updated.\'
        format.xml  { head :ok }
        format.js
      else
        format.html { redirect_to(\'/users/current\') }
        format.js
      end
    end
  end
我也有一个ajax电话看起来像:
$j(\'a.lock-status\').live(\'click\',function(e) {
    $j.get($j(this).attr(\'href\'));
    e.preventDefault();
});
总结一下: 如果我在浏览器的URL栏中输入切换URL,则它只能运行一次。如果我点击刷新,它将失败,并出现上述错误。 如果我使用ajax调用,它将运行一次。 如果我使用ajax调用然后刷新页面,则该页面将每次都适用于该第一个请求。 我觉得这可能与Rails中的GET / POST请求有关,但是我不确定吗?我将其范围缩小到:
@search = Search.find_by_permalink(params[:id])
在第一个呼叫后将任何呼叫调零,但我不确定为什么要这样做? 更新1: 这是2个请求的日志输出。 (第一次工作,第二次失败):
Processing SearchesController#update (for 127.0.0.1 at 2011-06-13 16:19:39) [GET]
  Parameters: {\"action\"=>\"update\",\"id\"=>\"9036304997196d83b20cba82a0cc67b8\",\"controller\"=>\"searches\"}
  Search Columns (1.0ms)   SHOW FIELDS FROM `searches`
  Search Load (0.4ms)   SELECT * FROM `searches` WHERE (`searches`.`permalink` = \'9036304997196d83b20cba82a0cc67b8\') LIMIT 1
  sql (0.1ms)   BEGIN
  Search Update (0.2ms)   UPDATE `searches` SET `locked` = 1,`updated_at` = \'2011-06-13 23:19:39\',`permalink` = \'97894f26ba36761d04575260b132c230\' WHERE `id` = 282
  sql (0.3ms)   COMMIT
Rendering searches/update
Completed in 17ms (View: 6,DB: 2) | 200 OK [http://localhost/search/toggle/9036304997196d83b20cba82a0cc67b8]
  sql (0.1ms)   SET NAMES \'utf8\'
  sql (0.1ms)   SET sql_AUTO_IS_NULL=0


Processing SearchesController#update (for 127.0.0.1 at 2011-06-13 16:19:41) [GET]
  Parameters: {\"action\"=>\"update\",\"controller\"=>\"searches\"}
  Search Columns (1.0ms)   SHOW FIELDS FROM `searches`
  Search Load (0.4ms)   SELECT * FROM `searches` WHERE (`searches`.`permalink` = \'9036304997196d83b20cba82a0cc67b8\') LIMIT 1

NoMethodError (undefined method `locked\' for nil:NilClass):
  app/controllers/searches_controller.rb:84:in `update\'
  /Users/Nick/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/webrick/httpserver.rb:104:in `service\'
  /Users/Nick/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/webrick/httpserver.rb:65:in `run\'
  /Users/Nick/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/webrick/server.rb:173:in `start_thread\'
  /Users/Nick/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/webrick/server.rb:162:in `start\'
  /Users/Nick/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/webrick/server.rb:162:in `start_thread\'
  /Users/Nick/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/webrick/server.rb:95:in `start\'
  /Users/Nick/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/webrick/server.rb:92:in `each\'
  /Users/Nick/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/webrick/server.rb:92:in `start\'
  /Users/Nick/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/webrick/server.rb:23:in `start\'
  /Users/Nick/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/webrick/server.rb:82:in `start\'

Rendered rescues/_trace (109.8ms)
Rendered rescues/_request_and_response (1.1ms)
Rendering rescues/layout (internal_server_error)
更新2: 好的,我知道你们在说什么……不确定是什么会改变固定链接。我将仔细检查AM中的模型代码。 谢谢!     

解决方法

        
Parameters: {\"action\"=>\"update\",\"id\"=>\"9036304997196d83b20cba82a0cc67b8\",\"controller\"=>\"searches\"}
  Search Columns (1.0ms)   SHOW FIELDS FROM `searches`
  Search Load (0.4ms)   SELECT * FROM `searches` WHERE (`searches`.`permalink` = \'9036304997196d83b20cba82a0cc67b8\') LIMIT 1
  Search Update (0.2ms)   UPDATE `searches` SET `locked` = 1,`updated_at` = \'2011-06-13 23:19:39\',`permalink` = \'97894f26ba36761d04575260b132c230\' WHERE `id` = 282
您发送了ID
9036304997196d83b20cba82a0cc67b8
,但您的模型正在保存
97894f26ba36761d04575260b132c230
为什么您的ѭ10会以不同的值更新?您的“十英镑”二传手会在分配时再生吗? 如果是这样,请解释为什么您在第二个相同的
id
请求中又得到
nil
。     ,        正如nowk所说,您的永久链接似乎不是搜索表中条目的恒定ID。 在第一个请求上,您将更新永久链接值,在第二个请求中,您将尝试使用旧的永久链接值查找条目,该值显然不再存在。 您的控制器应在以下这一行之后检查nil:
@search = Search.find_by_permalink(params[:id])
如果得到nil,则应返回404,因为找不到指定的记录。 但是,在这种情况下,如果每次更新都有一个新的永久链接对您的应用程序有意义,那么在一次成功的切换中,您可能希望发送回更新的永久链接并将其用于后续请求。 (理想情况下,这应该是对nowk的答案的评论,但是我找不到评论框。因此是另一个答案)     ,        尝试更改此:
if @search.update_attributes(params[:search])
对此:
if @search.save
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。