2010-03-07 4 views
1

В моем приложении рельсы У меня есть вспомогательные функции:Действительно умный помощник рельсы нужен

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

ответ

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/environment/production.rb). Если вы введете ошибки в свой вопрос, вы получите лучшую помощь.

EDIT: Кроме того, если вы удалили постоянную ссылку из списка (@@list -= [ permalink ]), я полагаю, что вторая часть вашего if-else никогда не произойдет (вы никогда не получите сообщение «эта страница уже отображается»). Более того, @@list -= ... не совсем эффективен. Возможно, вы захотите сделать @@list.delete(permalink) вместо @@list += ....

+0

да, это была опечатка ... далее ... вторая часть может произойти, когда вызывается inline_code (post.body) (если post.body называется render_page для той же постоянной ссылки) – Stefan

+0

Я имею в виду inline_render (post.body) – Stefan

+0

ОК. Как насчет журналов ошибок производства? – kikito

Смежные вопросы