Есть ли способ определить атрибут модели как всегда html_safe? - PullRequest
6 голосов
/ 07 июня 2011

У меня есть модель с именем Feature с переменной body_string, которая содержит разметку HTML, которую я хотел бы визуализировать, а не экранировать.

Каждый раз, когда я ссылаюсь на body_string в своих представлениях, мне нужно использовать <%=raw или .html_safe. Это кажется излишним и не очень сухим.

Есть ли способ раз и навсегда установить переменную body_string как html_safe?

Я предполагаю, что это произойдет в файле app/models/feature.rb, но я не могу точно определить, какой будет правильный синтаксис. Я думал об этом:

def body_string
  return self.body_string.html_safe
end

Но Rails это не нравится; возникает исключение stack level too deep.

Естественно, я мог определить переменную / метод с другим именем:

def safe_body_string
  return self.body_string.html_safe
end

А затем просто измените все ссылки в представлениях с body_string на safe_body_string. Но почему-то это выглядит почти так же НЕДОРОГО, как и просто использование raw или .html_safe.

Есть идеи, как лучше всего справиться с этим? Я чувствую, что должно быть что-то действительно элегантное, чего я просто не вижу.

Ответы [ 4 ]

9 голосов
/ 07 июня 2011

Просто используйте read_attribute, чтобы избежать рекурсивного вызова на body_string:

def body_string
  read_attribute(:body_string).html_safe
end

read_attribute дополняется write_attribute для настройкиатрибуты из вашей модели.

Примечание к стилю: не используйте явные return s, если они вам действительно не нужны.Результатом последнего оператора в методе является неявно значение, возвращаемое методом.

1 голос
/ 05 марта 2015

Хотя ответ @ meager определенно сработает, я не думаю, что эта логика принадлежит модели. Просто потому, что он добавляет проблемы уровня представления (безопасность HTML) на уровень модели, который должен просто включать бизнес-логику. Вместо этого я бы порекомендовал использовать для этого Presenter (см. http://nithinbekal.com/posts/rails-presenters/ или найдите драгоценный камень для этого - мне лично нравится Display Case ). Ваш докладчик может легко переопределить метод body_string и предоставить обозначение .html_safe при отображении на виде. Таким образом, вы отделяете свои проблемы и можете продолжать получать body_string от других моделей без смешения в представлении о проблеме.

0 голосов
/ 05 марта 2015

Или вы также можете использовать этот подход,

def body_string
  super && super.html_safe
end
0 голосов
/ 08 мая 2013

Может быть, этот драгоценный камень вам пригодится.Я также хотел перестать повторять html_safe все время, когда контент полностью надежный.

http://rubygems.org/gems/html_safe_attribute

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