首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要一个非常智能的rails助手

需要一个非常智能的rails助手
EN

Stack Overflow用户
提问于 2010-03-08 04:45:53
回答 2查看 190关注 0票数 1

在我的rails应用程序中,我有一个助手函数:

代码语言:javascript
复制
def render_page( permalink )
   page = Page.find_by_permalink( permalink )
   content_tag( :h3, page.title ) + inline_render( page.body )
end

如果我把这个页面叫做“主页”:

代码语言:javascript
复制
<%= render_page :home %>

而“主页”的主体是:

代码语言:javascript
复制
<h1>Home<h1/>
bla bla

<%= render_page :about %>
<%= render_page :contact %>

我会得到“主页”,与“关于”和“联系”,这是很好和简单…一直到有人去的地方,并将“主页”的内容更改为:

代码语言:javascript
复制
<h1>Home<h1/>
bla bla
<%= render_page :home %>    
<%= render_page :about %>
<%= render_page :contact %>

这将导致无限循环( webrick上的段错误)...

我如何将helper函数更改为不会落入此陷阱的函数?

我的第一次尝试是这样的:

代码语言:javascript
复制
@@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

它在我的开发环境中工作,但在生产中失败了……

有什么建议吗?

谢谢

斯特凡

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-03-10 13:15:56

@@变量会跨请求持久化。如果render_page抛出异常,它会将值留在@@list中,并可能导致后续请求的奇怪行为。试试这个:@list是视图的一个实例变量,它的作用域是请求。

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2010-03-08 07:46:03

你是在复制粘贴,还是编辑了什么?

如果没有,这里似乎有一个打字错误:

代码语言:javascript
复制
unless list.include?(permalink)

我想你的意思是:

代码语言:javascript
复制
unless @@list.include? permalink

希望这能有所帮助。如果没有,那么激活生产环境上的日志,这样您就可以看到错误的确切位置(您可以在config/environment/production.rb文件中执行此操作)。如果将错误粘贴到问题中,您将获得更好的帮助。

编辑:另外,如果你从列表中删除固定链接(@@list -= [ permalink ]),我相信if-else的第二部分永远不会发生(你永远不会收到“这个页面已经被渲染”的消息)。此外,@@list -= ...的效率也不是很高。你可能想用@@list.delete(permalink)代替--用@@list.push(permalink)代替@@list += ...

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2397901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档