Ошибка маршрутизации: не найдено ни одного маршрута [GET] /image/my_image.png

Я генерирую теги изображений из одной из моих моделей, и я не могу заставить Rails одновременно создавать рабочие URL-адреса как в режиме разработки, так и в режиме разработки. Я начал с этого в одной из моих моделей:

def traffic_light_icon(size=15)
  image_tag "/assets/#{size}/#{traffic_colour}.png"
end

(Я получаю доступ к image_tag с include ActionView::Helpers::AssetTagHelper.)

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

image_tag "#{size}/#{traffic_colour}.png"

вместо этого (как предлагают различные источники), тогда он даже не работает в процессе разработки - я получаю ошибку маршрутизации (нет совпадений с маршрутом [GET] /image/15/amber.png).

Что я делаю неправильно?

1 ответ

Решение

По сути, ответ - не используйте image_tag внутри модели, даже если вы нашли способ взломать, чтобы получить к нему доступ. Чтобы создать правильный контекстно-зависимый URL, помощнику необходим доступ к данным сеанса, которые недоступны из моделей. Это приводит к тому, что Rails создает тег изображения, но плохо, который не будет работать во всех ситуациях (в моем случае, в разработке, но не в производстве).

Существует хорошая информация о том, когда и как использовать помощники внутри моделей и контроллеров в Railscast 132 (с несколькими советами относительно того, когда не нужно или когда нужно искать проблемы, которые это вызывает).

Другие вопросы по тегам