2010-03-07 27 views
1

在我的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段故障)...

我会如何改变助手功能的东西,不会落入这个陷阱?

我第一次尝试是沿着线:

@@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 

这工作对我的开发环境,但在生产中被炸毁......

有什么建议?

谢谢
斯特凡

+1

永远不要相信@@变量。 – Matchu 2010-03-07 21:02:18

回答

1

@@变量在请求中持续存在。如果render_page引发异常,它会将值留在@@列表中,并可能导致后续请求的奇怪行为。试试这个:@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 
0

你复制粘贴,或者你有什么编辑出来?

如果不是,好像是这里一个错字:我认为你的意思

unless list.include?(permalink) 

unless @@list.include? permalink 

希望这有助于。如果没有,请在生产环境中激活日志,以便您可以看到错误的确切位置(您可以在config/environments/production.rb文件中执行此操作)。如果您将错误粘贴到您的问题中,您将获得更好的帮助。编辑:另外,如果你从列表中删除永久链接(@@list -= [ permalink ]),我相信你的if-else的第二部分永远不会发生(你永远不会得到“这个页面已经被渲染”的消息)。此外,@@list -= ...并不完全有效。您可能需要执行@@list.delete(permalink)而不是--而不是@@list += ...

+0

是的,这是一个错字...此外...第二部分可能发生在inline_code(post.body)被调用时(如果post.body称为render_page为相同的固定链接) – Stefan 2010-03-08 07:21:41

+0

我的意思是inline_render(post.body) – Stefan 2010-03-08 07:47:14

+0

好。生产错误日志怎么样? – kikito 2010-03-08 11:37:10