Учебное пособие по Ruby On Rails — Gravatar вводит текст, а не изображение

В: Как я могу решить эту проблему, не слишком сильно изменяя код учебника? Я хотел бы меньше отходить от учебного кода.

Я работаю с онлайн-учебником Ruby on Rails Майкла Хартла. В главе 7 мы начинаем добавлять фотографии профиля с помощью плагина Gravatar. (Похоже, это не совместимо с Rails 3, но вопрос не в этом.)

У меня работает плагин, но мое приложение Rails не показывает изображение Gravatar. Он показывает текстовую строку. т.е. он вводит код Gravatar в виде текста, а не тега html.

Вместо того, чтобы показывать в файле следующее:

<img class="gravatar" alt="" width="52" height="52" src="http://www.gravatar.com/avatar/b58996c504c5638798eb6b511e6f49af?rating=PG&amp;size=52" />

Это показывает это (отображение текста, а не изображения):

&lt;img class=&quot;gravatar&quot; alt=&quot;&quot; width=&quot;52&quot; height=&quot;52&quot; src=&quot;http://www.gravatar.com/avatar/b58996c504c5638798eb6b511e6f49af?rating=PG&amp;amp;size=52&quot; /&gt;

Мой файл представления содержит:

<%= gravatar_for user, size: 52 %>

Плагин Gravatar содержит (gravatar.rb):

def gravatar(email, options={})
  src = h(gravatar_url(email, options))
  options = DEFAULT_OPTIONS.merge(options)
  [:class, :alt, :size].each { |opt| options[opt] = h(options[opt]) }
  "<img class=\"#{options[:class]}\" alt=\"#{options[:alt]}\" width=\"#{options[:size]}\" height=\"#{options[:size]}\" src=\"#{src}\" />"
end

Другая информация:

Я работаю над коробкой Windows 7, работающей под управлением Rails 3.2.


person dmuk    schedule 24.07.2012    source источник


Ответы (2)


Сообщите Rails, что HTML является доверенным (и поэтому его не следует экранировать), используя метод html_safe :

def gravatar_for email, options={}
  # ...
  "<img class=\"#{options[:class]}\" ... />".html_safe
end

Справочная информация: http://yehudakatz.com/2010/02/01/safebuffers-and-rails-3-0/

Между прочим, вы можете и, вероятно, должны аккуратно и полностью обойти эту проблему, просто используя встроенный в Rails image_tag, который имеет бонусный эффект избавления от этой длинной, уродливой жестко закодированной строки:

def gravatar_for email, options={}
  options = DEFAULT_OPTIONS.merge options
  options[:size] = "%{size}x%{size}" % options  # image_tag expects e.g. "48x48"

  image_tag gravatar_url(email, options), options
end

(Не позволяйте этому "..." % options сбить вас с толку — в основном это сокращение от sprintf.)

person Jordan Running    schedule 24.07.2012

Попробуйте с

<%= raw gravatar_for(user, size: 52) %>

Поведение по умолчанию, начиная с рельсов 3, заключается в том, чтобы экранировать HTML при использовании <%= ... %> ; raw отключите это поведение.

Подробнее

person Baldrick    schedule 24.07.2012