Ruby on rails Rails控制器更新方法只对一个调用有效,然后失败?
我有一个简单的url,可以在我的搜索模型中切换一个字段。(锁定)我想通过单击链接切换此字段 例如: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
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
您发送了id9036304997196d83b20cba82a0cc67b8
但您的型号正在保存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。把它换成一个,它的工作原理和预期的一样!谢谢