Ruby on rails Rails控制器更新方法只对一个调用有效,然后失败?

Ruby on rails Rails控制器更新方法只对一个调用有效,然后失败?,ruby-on-rails,Ruby On Rails,我有一个简单的url,可以在我的搜索模型中切换一个字段。(锁定)我想通过单击链接切换此字段 例如: http://localhost:3000/search/toggle/fe5c72164908af20a7727f324e2fdbc1 该链接在一次呼叫中工作正常,然后出现以下错误: undefined method `locked' for nil:NilClass 切换路径仅指向搜索更新方法: 路线: map.connect 'search/toggle/:id', :controlle

我有一个简单的url,可以在我的搜索模型中切换一个字段。(锁定)我想通过单击链接切换此字段

例如:

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
$j('a.lock-status').live('click', function(e) {
    $j.get($j(this).attr('href'));
    e.preventDefault();
});
我还有一个ajax调用,如下所示:

  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
$j('a.lock-status').live('click', function(e) {
    $j.get($j(this).attr('href'));
    e.preventDefault();
});
总结如下:

如果我在浏览器的URL栏中输入一个切换URL,它会工作一次。如果我点击refresh,它就会失败,并给出上述错误

如果我使用ajax调用,它只工作一次

如果我使用ajax调用,然后刷新页面,每次第一个请求都可以使用

我觉得这可能与rails中的GET/POST请求有关,但我不确定?我把范围缩小到:

@search = Search.find_by_permalink(params[:id])
在第一次通话后重新调整nill,但我不知道为什么会这样做

更新1:

下面是2个请求的日志输出。(第一次工作,第二次失败):

更新2:

好吧,我明白你们的意思了。。。不确定什么会改变永久链接。我将再次检查AM中的模型代码

谢谢

尝试更改此选项:

if @search.update_attributes(params[:search])
为此:

if @search.save
您发送了id
9036304997196d83b20cba82a0cc67b8
但您的型号正在保存
97894f26ba36761d04575260b132c230

为什么您的
permalink
会被另一个值更新?您的
permalink
setter是否在分配时重新生成


如果是这种情况,请解释为什么您在第二个相同的
id
请求中返回
nil

正如nowk所说,您的permalink似乎不是搜索表中条目的常量id

在第一个请求中,您更新permalink值,在第二个请求中,您尝试使用旧的permalink值查找条目,该值显然不再存在

您的控制器应在以下行之后检查nil:
@search=search.find\u by_permalink(params[:id])
如果您得到nil,则应返回404,因为找不到指定的记录

但是,在这种情况下,如果每次更新都有一个新的永久链接对应用程序有意义,那么在成功切换时,您可能希望发回更新的永久链接,并将其用于后续请求


(理想情况下,这应该是对nowk答案的评论,但我找不到评论框。因此另一个答案)

同样的结果。。。仅供参考,我已将日志输出添加到原始问题中。请发布您的
搜索
模型的代码——无论何时保存,其中的某些内容都会更改永久链接。除非您有更多分数(我不记得限制),否则您不能对其他用户的答案发表评论。这就是为什么你需要自己回答是的,你是对的!有一个before_save操作来创建MD5哈希,而不是before_create。把它换成一个,它的工作原理和预期的一样!谢谢