Пропустить HTML escape в пользовательском помощнике label_tag в Rail 3 - PullRequest
3 голосов
/ 27 мая 2010

У меня есть хороший класс ErrorFormBuilder, который позволяет мне добавить описание ошибки рядом с соответствующим полем в форме:

    class ErrorFormBuilder < ActionView::Helpers::FormBuilder
  #Adds error message directly inline to a form label
  #Accepts all the options normall passed to form.label as well as:
  #  :hide_errors - true if you don't want errors displayed on this label
  #  :additional_text - Will add additional text after the error message or after the label if no errors
  def label(method, text = nil, options = {})
    #Check to see if text for this label has been supplied and humanize the field name if not.
    text = text || method.to_s.humanize
    #Get a reference to the model object
    object = @template.instance_variable_get("@#{@object_name}")

    #Make sure we have an object and we're not told to hide errors for this label
    unless object.nil? || options[:hide_errors]
      #Check if there are any errors for this field in the model
      errors = object.errors.on(method.to_sym)
      if errors
        #Generate the label using the text as well as the error message wrapped in a span with error class
        text += " <br/><span class=\"error\">#{errors.is_a?(Array) ? errors.first : errors}</span>"
      end
    end
    #Add any additional text that might be needed on the label
    text += " #{options[:additional_text]}" if options[:additional_text]
    #Finally hand off to super to deal with the display of the label
    super(method, text, options)
  end
end

Но HTML:

text += " <br/><span class=\"error\">#{errors.is_a?(Array) ? errors.first : errors}</span>"

по умолчанию экранируется в представлении ... Я попытался добавить параметр {: escape => false}:

super(method, text, options.merge({:escape => false}))

без успеха

Есть ли способ обойти это поведение?

Спасибо

Ответы [ 2 ]

9 голосов
/ 30 мая 2010

Вы пытались сделать вашу строку html_safe?

irb(main):010:0> a = "A string"
=> "A string"
irb(main):011:0> a.html_safe?
=> false
irb(main):012:0> b = a.html_safe
=> "A string"
irb(main):013:0> b.html_safe?
=> true

См. http://www.railsdispatch.com/posts/security и прокрутите вниз до «Что нужно знать» внизу:

В общем, вы можете создать свое Rails-приложение точно так же, как и раньше. Rails будет автоматически экранировать любые строки, которые он не создает. Практически во всех случаях это правильное поведение, дальнейшие изменения не требуются.

Если Rails экранирует строку, через которую вы хотите пройти, не экранируя, просто пометьте ее как безопасную. Если вы создаете строку в качестве помощника, вы можете пометить ее части как безопасные.

Я не могу проверить, будет ли это работать в вашем вспомогательном помощнике, но я так думаю.

8 голосов
/ 17 октября 2010

Просто используйте <%= raw your_variable_here %>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...