问题描述
|
我有一个简单的网址,它将在我的搜索模型中切换一个字段。 (锁定)我想通过单击链接来切换此字段。
例:
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
您发送了ID9036304997196d83b20cba82a0cc67b8
,但您的模型正在保存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