#ruby-on-rails #heroku #ruby-on-rails-4 #asset-pipeline
#ruby-on-rails #heroku #ruby-on-rails-4 #asset-pipeline
Вопрос:
У меня есть два вопроса, но я предполагаю, что они оба приводят к одному и тому же ответу.
Оба они связаны с тем фактом, что статические изображения отображаются в режиме разработки, а не на производстве (heroku).
Случай 1:
В моей model.rb
has_attached_file :avatar, styles: {
thumb: '32x32#',
medium: '512x512#'
},
:default_url => ActionController::Base.helpers.asset_path('/assets/avatar_:style.png') ## <- This line (#1)
Случай 2:
В моем view.html.haml у меня есть встроенный javascript
:javascript
$('.star').raty({
path: '/assets', ### <- This line (#2)
readOnly: true,
noRatedMsg : "I haven't been rated yet!",
score: function() {
return $(this).attr('data-score');
}
});
В СЛУЧАЕ 1 я пытаюсь реализовать изображение по умолчанию, если пользователь не загружает фотографию профиля (с помощью скрепки) с двумя изображениями avatar_thumb.png
и avatar_medium.png
внутри /app/assets/images
В СЛУЧАЕ 2 я пытаюсь реализовать функцию оценки 5 звезд, используя стороннюю библиотеку raty, для которой требуются изображения «звезды«. Я также разместил три изображения, которые поставляются с этой библиотекой /app/assets/images
.
Вопрос: В обоих случаях изображения отображаются в режиме разработки, но не при развертывании в Heroku. Как мне решить эту проблему.
PS: Я абсолютно новичок в rails, буду признателен за любую помощь.
Ответ №1:
Конвейер ресурсов здесь не облегчает вашу жизнь — Paperclip предполагает, default_url
что это то, где он может заменить :style
часть требуемым значением, но это не может работать, поскольку это, очевидно, также изменит часть отпечатка имени файла.
Проще всего здесь не использовать конвейер ресурсов для этих изображений. Вам не нужно использовать конвейер ресурсов для чего-либо на самом деле, и выгода для изображений довольно минимальна по сравнению с файлами javascript или css.
Для этого переместите изображения в public/images
. Затем для первого случая измените URL-адрес по умолчанию на
/images/avatar_:style.png
и для второго случая задайте путь к /images
Вы могли бы заставить второй случай работать с конвейером ресурсов, если бы захотели — что-то вроде
:javascript
$('.star').raty({
readOnly: true,
starHalf: '#{asset_path('star-half.png')}',
starOff: '#{asset_path('star-off.png')}',
starOn: '#{asset_path('star-on.png')}',
cancelOn: '#{asset_path('cancel-on.png')}',
cancelOff: '#{asset_path('cancel-off.png')}',
noRatedMsg : "I haven't been rated yet!",
score: function() {
return $(this).attr('data-score');
}
});
Комментарии:
1. Спасибо @Frederick, это сделало это. Я потерял надежду на это. 🙂
Ответ №2:
Поскольку вы новичок, позвольте мне описать, как это работает для вас:
—
Активы
При развертывании приложения Rails ваше assets
приложение будет частью того, что известно как asset pipeline
. При разработке ваши файлы ресурсов хранятся в app/assets/...
Когда вы используете asset path helpers
, Rails вызовет для вас следующие пути:
app/assets/...
vendor/assets/...
public/...
Проблема, с которой вы сталкиваетесь, находится в разработке, поскольку все ваши активы присутствуют app/assets
, вы сможете вызывать все файлы, которые вы хотите, без разбора
—
Производство
Когда вы запускаете свое приложение в production
режиме mode, все становится немного сложнее
Во-первых, вы не можете полагаться на то, что ваши активы находятся в app/assets
каком-либо более производственном режиме вообще (не всегда, но на Heroku наверняка) означает, что вам придется precompile
использовать свои активы:
В рабочей среде Rails по умолчанию предварительно компилирует эти файлы в public / assets. Затем веб-сервер использует предварительно скомпилированные копии в качестве статических ресурсов. Файлы в app / assets никогда не передаются непосредственно в производство.
Это означает, что если вы хотите загружать ресурсы в производство, особенно на Heroku, вам нужно asset_paths
будет правильно использовать (в основном потому, что Rails будет fingerprint
вашими производственными / скомпилированными ресурсами)
—
Исправить
В прямой связи с вашим вопросом я бы сделал это:
1
:default_url => asset_path('avatar_:style.png') #-> not sure about the :style part here
2
:javascript
$('.star').raty({
path: asset_url, #-> will use the asset_url
readOnly: true,
noRatedMsg : "I haven't been rated yet!",
score: function() {
return $(this).attr('data-score');
}
});
Комментарии:
1. Спасибо за богатый ответ. При реализации предложенных вами изменений я вижу следующие ошибки: Case 1 —
undefined method
asset_path’ для #<Class:0x000001087d5178>` и дляCase 2
изображений не отображаются, а в firebug видны следующие ошибки —ReferenceError: asset_url is not defined
2. Настолько эффективно это не работает. : ( Есть еще идеи?