2010-03-07 7 views
1

Dans mon application rails J'ai une fonction d'assistance:Un vraiment aide à puce rails nécessaires

def render_page(permalink) 
    page = Page.find_by_permalink(permalink) 
    content_tag(:h3, page.title) + inline_render(page.body) 
end 

Si j'ai appelé la page "maison" avec:

<%= render_page :home %> 

et le corps de "home" a été :

<h1>Home<h1/> 
bla bla 

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

je recevrais « home », avec « environ » et « contact », il est agréable et simple ... jusqu'à où quelqu'un va et change " maison » contenu de la page:

<h1>Home<h1/> 
bla bla 
<%= render_page :home %>  
<%= render_page :about %> 
<%= render_page :contact %> 

qui se traduira par une boucle infinie (un défaut du segment sur webrick) ...

Comment puis-je changer la fonction d'aide à quelque chose qui ne va pas tomber dans ce piège?

Ma première tentative a été le long des lignes de:

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

qui a travaillé sur mon environnement de développement, mais ont bombardé dans la production ...

des suggestions?

Merci Vous
Stefan

+1

Ne faites jamais confiance aux variables @@. – Matchu

Répondre

1

@@ Les variables persistent dans les demandes. Si render_page lançait une exception, il laisserait des valeurs dans @@ list et provoquerait probablement un comportement bizarre pour les requêtes suivantes. Essayez ceci: @list est une variable d'instance pour la vue et est limitée à la requête.

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

Êtes-vous copier-coller, ou avez-vous quoi que ce soit édité sur?

Sinon, il semble y avoir une faute de frappe ici:

unless list.include?(permalink) 

Je pense que vous vouliez dire:

unless @@list.include? permalink 

Hope this helps. Si ce n'est pas le cas, activez les journaux en production afin de voir exactement où se trouve l'erreur (vous pouvez le faire dans le fichier config/environments/production.rb). Si vous collez les erreurs dans votre question, vous obtiendrez une meilleure aide.

EDIT: Aussi, si vous supprimez le permalien de la liste (@@list -= [ permalink ]) je crois que la deuxième partie de votre if-else ne se produira jamais (vous ne recevrez jamais un message "cette page est déjà rendue"). De plus, @@list -= ... n'est pas vraiment efficace. Vous voudrez peut-être faire @@list.delete(permalink) à la place - et @@list.push(permalink) au lieu du @@list += ....

+0

oui, c'était une faute de frappe ... en outre ... la deuxième partie pourrait se produire quand inline_code (post.body) est appelé (si post.body appelé render_page pour le même permalink) – Stefan

+0

je veux dire inline_render (post.body) – Stefan

+0

D'ACCORD. Qu'en est-il des journaux d'erreurs de production? – kikito