2010-09-16 16 views
1

J'ai rencontré un gros problème en déplaçant mon application vers Rails 3. J'ai un assistant de vue que j'appelle 'WidgetHelper'. Cela aide à rendre certains partiels automatiquement quand je me réfère à lui. Par exempleRails 3 widget assistant partiel

<%= widget('loginbox', :global => true) %> 

Mais cela ne fonctionne pas correctement. Il rend le code HTML comme je le veux, mais échappe à la valeur de retour, ce qui n'est pas attendu. Comment puis-je dire à rendre (ou à quelque chose) à pas échapper la valeur de retour pour moi?

Voici mon code:

def widget(widget, options={}) 
    begin 
     unless options[:fullpath] 
     render :partial => widget_path(widget, options[:global]) 
     else 
     render "widgets/#{widget}" 
     end 
    rescue ActionView::MissingTemplate 
     "<!-- widget: #{widget.inspect}, #{options.inspect} -->" 
    end 
    end 

Répondre

3
def widget(widget, options={}) 
    begin 
    unless options[:fullpath] 
     raw render(:partial => widget_path(widget, options[:global])) 
    else 
     raw render("widgets/#{widget}")) 
    end 
    rescue ActionView::MissingTemplate 
    raw "<!-- widget: #{widget.inspect}, #{options.inspect} -->" 
    end 
end 

La méthode raw de Rails 3 fait l'inverse de h méthode dans Rails 2. Échapper une chaîne était fait avec la méthode h sur Rails 2. Sur Rails 3, les chaînes sorties d'une vue sont échappées par défaut, et l'échappement peut être désactivé par e raw méthode.

+0

Merci, cela fonctionne bien. J'ajoute un score pour vous et pour @Jamie Wong aussi, parce que j'ai utilisé les deux solutions dans mon application. –

+0

Cela semble un peu en arrière dans mon esprit - quand voulez-vous jamais un widget sans cru? Spécifier que vous voulez le brut devrait faire partie de la définition dans mon esprit, pas l'invocation. –

+0

Vous avez raison Jamie. Fix à venir. – edgerunner

1

Rails 3 a changé la façon dont fonctionne le filtrage de contenu - par défaut suppose que vous voulez tout filtré.

Vous pouvez corriger cela en utilisant html_safe:

"<!-- widget: #{widget.inspect}, #{options.inspect} -->".html_safe

Voir: http://asciicasts.com/episodes/204-xss-protection-in-rails-3