在我的rails应用程序中,我有一个助手函数:
def render_page( permalink )
page = Page.find_by_permalink( permalink )
content_tag( :h3, page.title ) + inline_render( page.body )
end如果我把这个页面叫做“主页”:
<%= render_page :home %>而“主页”的主体是:
<h1>Home<h1/>
bla bla
<%= render_page :about %>
<%= render_page :contact %>我会得到“主页”,与“关于”和“联系”,这是很好和简单…一直到有人去的地方,并将“主页”的内容更改为:
<h1>Home<h1/>
bla bla
<%= render_page :home %>
<%= render_page :about %>
<%= render_page :contact %>这将导致无限循环( webrick上的段错误)...
我如何将helper函数更改为不会落入此陷阱的函数?
我的第一次尝试是这样的:
@@list = []
def render_page( permalink )
unless @@list.include?(permalink)
@@list += [ permalink ]
page = Page.find_by_permalink
result = content_tag( :h3, page.title ) + inline_render( page.body )
@@list -= [ permalink ]
return result
else
content_tag :b, "this page is already being rendered"
end
end它在我的开发环境中工作,但在生产中失败了……
有什么建议吗?
谢谢
斯特凡
发布于 2010-03-10 13:15:56
@@变量会跨请求持久化。如果render_page抛出异常,它会将值留在@@list中,并可能导致后续请求的奇怪行为。试试这个:@list是视图的一个实例变量,它的作用域是请求。
def render_page( permalink )
@list ||= []
unless @list.include?(permalink)
@list << permalink
page = Page.find_by_permalink
result = content_tag( :h3, page.title ) + inline_render( page.body )
@list.delete permalink
return result
else
content_tag :b, "this page is already being rendered"
end
end发布于 2010-03-08 07:46:03
你是在复制粘贴,还是编辑了什么?
如果没有,这里似乎有一个打字错误:
unless list.include?(permalink)我想你的意思是:
unless @@list.include? permalink希望这能有所帮助。如果没有,那么激活生产环境上的日志,这样您就可以看到错误的确切位置(您可以在config/environment/production.rb文件中执行此操作)。如果将错误粘贴到问题中,您将获得更好的帮助。
编辑:另外,如果你从列表中删除固定链接(@@list -= [ permalink ]),我相信if-else的第二部分永远不会发生(你永远不会收到“这个页面已经被渲染”的消息)。此外,@@list -= ...的效率也不是很高。你可能想用@@list.delete(permalink)代替--用@@list.push(permalink)代替@@list += ...。
https://stackoverflow.com/questions/2397901
复制相似问题