2013-07-12 3 views
31

У меня есть приложение Rails 4 сjavascript_include_tag Rails 4 производящая "/ JavaScripts /" вместо "/ активы" в производстве

<%= javascript_include_tag "modernizr", "data-turbolinks-track" => true %> 

в голове. В разработке, следующий HTML-оказывается, и Modernizr загружен:

<script data-turbolinks-track="true" src="/assets/modernizr.js?body=1"></script> 

В производстве, то followign HTML оказывается, и Modernizr является не загружен (404 не найден):

<script data-turbolinks-track="true" src="/javascripts/modernizr.js"></script> 

В производстве /assets/modernizr.js находится и просматривается.

Rails documentation говорит, что javascript_include_tag должен генерировать

<script data-turbolinks-track="true" src="/assets/modernizr.js?body=1"></script> 

В производстве, мои stylesheet_link_tag s отлично, ссылки на каталог /assets/.

Почему javascript_include_tag, ссылающийся на /javascripts вместо /assets на производстве, и как его исправить?

+2

Удалось ли вам найти решение этой проблемы ? Я испытываю точно такую ​​же проблему, но ни один из ответов здесь не помогает. – gregoltsov

+2

, вы должны иметь отпечаток с атрибутом отпечатка, например '/ assets/light-0cd9377b97b67182b68c8023bd6c2fbe.css' – phoet

+1

Является ли это чистым приложение Rails 4 или обновление с более ранней версии Rails? –

ответ

21

Одно из утверждений использования для AssetUrlHelper указывает он будет производить/JavaScripts/URLs нравится то, что вы видите:

# asset_path "приложение", введите:: JavaScript # => /javascripts/application.js

(от asset_url_helper.rb линии 117 - [1])

Этот код выглядит как это может быть достигнуто только в случае, если предкомпилированного актив отсутствует так, казалось бы, что ваш сборник активов не работает (мои развертываний обычно терпят неудачу, когда это происходит, поэтому, возможно, ваш даже не стреляет).

То же asset_url_helper.rb называет/JavaScripts/часть «extname» и использует следующую карту, чтобы знать, как создать имя:

# Maps asset types to public directory. 
    ASSET_PUBLIC_DIRECTORIES = { 
    audio:  '/audios', 
    font:  '/fonts', 
    image:  '/images', 
    javascript: '/javascripts', 
    stylesheet: '/stylesheets', 
    video:  '/videos' 
    } 

Новый Rails 4 приложение имеет это в конфиге/среды/production.rb

# Do not fallback to assets pipeline if a precompiled asset is missed. 
    config.assets.compile = false 

, который, похоже, соответствует поведению, которое вы видите.

+4

спасибо! Некоторое js/css-файл не предварительно скомпилирован, потому что он не может быть связан с файлом application.js/css, поэтому предварительная компиляция ресурсов rails 4 не может найти эти файлы. Вы можете добавить файл в список прекомпиляции файлов, как этот '# config/environment/production.rb config.assets.precompile + = [Proc.new {| путь | File.basename (path) = ~ /^[^_].*\.\w+$/}] ' – comme

+4

У Rails, похоже, есть очень плохие значения по умолчанию для конвейера активов. – jeffcook2150

-1

Возможно, это файл должен быть в/vendor/assets/javascript вместо/app/assets/javascript. Папка Vendor предназначена для библиотек javascript, а папка App - для вашего кода.

Лучшим решением, чем добавление тега в макет, будет добавление ссылки на скрипт к вашему application.js, и пусть компилятор sass сжимает и присоединяет его к основному файлу javascript.

Если вы не получите окончательный ответ, проверьте: http://guides.rubyonrails.org/asset_pipeline.html#asset-organization

+0

Файлы в папках '/ vendor/assets/javascript /' и '/ app/assets/javascript /' скомпилируются в папку 'public/assets /', а сгенерированный файл 'manifest.json' описывает логические пути найти отпечатки пальцев. Однако для этого, путь, созданный 'javascript_include_tag', все равно должен указывать на' assets/'. – gregoltsov

4

Обязательно прекомпилировать свои активы в производстве, выполнив команду:

RAILS_ENV=production bundle exec rake assets:precompile 

Руководство Rails по трубопроводу активов может дать вам более подробную информацию: http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets

+0

Но это только компилирует активы в папку 'public/assets /' - это не объясняет, почему путь генерируется некорректно. – gregoltsov

+0

Вы изменили путь в своем 'production.rb'? Он будет выглядеть как 'config.assets.prefix ="/some_other_path "http://guides.rubyonrails.org/asset_pipeline.html#changing-the-assets-path –

+0

Нет, я этого не делал. Все мои активы в 'vendor /' скомпилированы правильно в '/ assets', и пути верны.Это просто javascripts в '/ app/assets' по какой-то причине имеют неправильный путь, созданный' javascript_include_tag'. И да, я добавил их к 'precompile'. Действительно странное поведение ... – gregoltsov

1

у меня есть новое приложение, использующее Rails 4 развернутые на Heroku с:

. 210
<%= javascript_include_tag "application", "data-turbolinks-track" => true %> 

мое приложение Javascript (отпечатков пальцев) .js вызывается из ЦСИ: активы/application.js

я думаю, ваша проблема прийти от чего-то в вашем production.rb, которые определяют активы из другого места.

Так может быть, вы можете добавить Moderniz.js к

config.assets.precompile = [».js', ' .css', '* .css.erb']

in config/production.rb

Просто попробуйте модернизировать скрипт в вашем приложении.JS

// = требуется mordernizr

и удалить вызов сценария Modernizr в макете.

<%= javascript_include_tag "modernizr", "data-turbolinks-track" => true %> 

Можете ли вы проверить, где ваше приложение application.js подается в вашу производственную среду?

12

По умолчанию Rails только прекомпилирует application.js, application.css и любые изображения, найденные в пути к активам. Поэтому в производстве mordernizr не будет прекомпилироваться, и поэтому помощники javascript не смогут найти файл.

Для того, чтобы исправить эту проблему, вы можете добавить Modernizr в прекомпиляции список, изменив следующий конфиг в production.rb

config.assets.precompile += ['modernizr.js'] 

Для получения дополнительной информации см the Rails Guides

Смежные вопросы