2012-05-02 4 views
2

У нас есть модель ActiveRecord с атрибутом html (скажем Post#body). Есть ли хороший способ, что вызов body на post возвращает строку html_safe?? Например .:Атрибут Mark ActiveRecord как html_safe

class Post < ActiveRecord::Base 
    # is_html_escaped :body or somesuch magic 
end 

Post.first.body.html_safe? # => true 

Проблема в противном случае является то, что мы должны назвать raw все, что мы покажем, что поле.

ответ

3

Вот так я нашел:

class Post < ActiveRecord::Base 
    def message 
    super.html_safe 
    end 

    def message=(new_mess) 
    new_mess = ERB::Util.html_escape(new_mess.sanitize) unless new_mess.html_safe? 
    super(new_mess) 
    end 
end 
0

FYI. Я сделал модуль для этого

module SanitizeOnly 

    def self.included(mod) 
    mod.extend(ClassMethods) 
    end 

    module ClassMethods 

    def sanitize_on_input_only(*attribute_names) 

     attribute_names.map(&:to_s).each do | attribute_name | 
     class_eval <<-RUBY, __FILE__, __LINE__ + 1 

     def #{attribute_name} 
      super.html_safe 
     end 

     def #{attribute_name}=(new_val) 
      new_val = ERB::Util.html_escape(new_val.sanitize) unless new_val.html_safe? 
      super(new_val) 
     end 

     RUBY 
     end 
    end 

    end 
end 

использовать его просто включить его в вашей модели и добавить атрибуты, которые вы хотите, чтобы избежать использования сырья для к sanitize_on_input_only линии, как следующее:

sanitize_on_input_only :message, :another_attribute, ... 
Смежные вопросы