我试图创建一个Sprocket指令来考虑我的配置文件中的更改:
在initializers / sprockets.rb中
class Sprockets::DirectiveProcessor
def process_depend_on_config_directive(file)
path = File.expand_path(file, "#{Rails.root}/config/locales")
context.depend_on(path)
end
end
在application.js中
//= depend_on_config en.yml
//= depend_on_config fr.yml
刷新有关js文件的页面给了我不同的答案,我无法修复此行为:
15:02:03 web.1 | 127.0.0.1 – – [17/Jul/2014 15:02:03] “GET
/angular_js/services/better_translate_service-04bd3e149eb227767d3910de31fb2489.js?body=1
HTTP/1.1” 200 23560 0.0105 15:02:05 web.1 | 127.0.0.1 – –
[17/Jul/2014 15:02:05] “GET
/angular_js/services/better_translate_service-04bd3e149eb227767d3910de31fb2489.js?body=1
HTTP/1.1” 200 23564 0.0079 15:02:06 web.1 | 127.0.0.1 – –
[17/Jul/2014 15:02:06] “GET
/angular_js/services/better_translate_service-04bd3e149eb227767d3910de31fb2489.js?body=1
HTTP/1.1” 304 – 0.0061 15:02:06 web.1 | 127.0.0.1 – – [17/Jul/2014
15:02:06] “GET
/angular_js/services/better_translate_service-04bd3e149eb227767d3910de31fb2489.js?body=1
HTTP/1.1” 200 23560 0.0091 15:02:07 web.1 | 127.0.0.1 – –
[17/Jul/2014 15:02:07] “GET
/angular_js/services/better_translate_service-04bd3e149eb227767d3910de31fb2489.js?body=1
HTTP/1.1” 200 23564 0.0076 15:02:07 web.1 | 127.0.0.1 – –
[17/Jul/2014 15:02:07] “GET
/angular_js/services/better_translate_service-04bd3e149eb227767d3910de31fb2489.js?body=1
HTTP/1.1” 304 – 0.0093 15:02:08 web.1 | 127.0.0.1 – – [17/Jul/2014
15:02:08] “GET
/angular_js/services/better_translate_service-04bd3e149eb227767d3910de31fb2489.js?body=1
HTTP/1.1” 200 23560 0.0080 15:02:08 web.1 | 127.0.0.1 – –
[17/Jul/2014 15:02:08] “GET
/angular_js/services/better_translate_service-04bd3e149eb227767d3910de31fb2489.js?body=1
HTTP/1.1” 200 23564 0.0091 15:02:09 web.1 | 127.0.0.1 – –
[17/Jul/2014 15:02:09] “GET
/angular_js/services/better_translate_service-04bd3e149eb227767d3910de31fb2489.js?body=1
HTTP/1.1” 304 – 0.0059
编辑:一些澄清:
>我想指出,资产文件的哈希是相同的,内容是不同的.
>当我说刷新页面时,我的意思是我在另一个选项卡中打开资产文件,当我刷新页面时,内容会发生变化.
Edit2:添加更多信息:
更好的翻译服务文件(.erb):
<% environment.context_class.instance_eval { include ApplicationHelper } %>
<%# encoding: utf-8 %>
app.factory('Pg', ['SETTINGS', function(SETTINGS) {
var polyglot = {};
polyglot.translations = {
en: new Polyglot({ phrases: <%= I18n.with_locale(:en) { phrases_for_polyglot.to_json } %>, locale: "en" }),
fr: new Polyglot({ phrases: <%= I18n.with_locale(:fr) { phrases_for_polyglot.to_json } %>, locale: "fr" })
};
polyglot.current = 'en';
polyglot.t = _.memoize(function(key, opts) {
return polyglot.translations[polyglot.current].t(key, opts);
}, function(key, opts){
if(opts===undefined){ return polyglot.current + ''+ key; }
return polyglot.current + '' + key + polyglot.serialize(opts);
});
polyglot.serialize = function(obj) {
var str = [];
for(var p in obj){
if(obj.hasOwnProperty(p)) {
str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
}
}
return str.join("&");
};
//fde
polyglot.selectLanguage = function(lang){
polyglot.current = lang;
};
return polyglot;
}]);
开发内容.rb:
# Settings specified here will take precedence over those in config/application.rb.
# In the development environment your application's code is reloaded on
# every request. This slows down response time but is perfect for development
# since you don't have to restart the web server when you make code changes.
config.cache_classes = false
# Do not eager load code on boot.
config.eager_load = false
# Show full error reports and disable caching.
config.consider_all_requests_local = true
config.action_controller.perform_caching = false
# Don't care if the mailer can't send.
config.action_mailer.raise_delivery_errors = false
# Print deprecation notices to the Rails logger.
config.active_support.deprecation = :log
# Raise an error on page load if there are pending migrations
# config.active_record.migration_error = :page_load
# Debug mode disables concatenation and preprocessing of assets.
# This option may cause significant delays in view rendering with a large
# number of complex assets.
config.assets.debug = true
config.assets.digest = true
config.assets.configure do |env|
env.cache = ActiveSupport::Cache.lookup_store(:null_store)
end
我正在使用rails 4.1.1.有什么建议?我可以根据需要提供更多信息.
尝试答案后更新:我在下面的答案后做了以下更改:
application.js => application.js.erb
<%= depend_on 'en.yml' %>
<%= depend_on 'fr.yml' %>
<% I18n.backend.send(:init_translations) unless I18n.backend.initialized? %>
console.log(<%= I18n.backend.send(:translations).to_json %>);
//= require angular-rails-templates
//= require honeybadger.min
//= require_tree ./dependencies
//= require lodash.min
//= require polyglot.min
//= require lunr.min
//= require angulartics.min
//= require angulartics-ga.min
//= require ./angular_js/fancyinput_library/ac-fancy-input
//= require angular-main
//= require_tree ./angular_js
//= require_tree ../templates
将以下内容添加到application.rb中
config.assets.paths<< Rails.root.join(‘config’,’locales’) 新开发.rb
# Settings specified here will take precedence over those in config/application.rb.
# In the development environment your application's code is reloaded on
# every request. This slows down response time but is perfect for development
# since you don't have to restart the web server when you make code changes.
config.cache_classes = false
# Do not eager load code on boot.
config.eager_load = false
# Show full error reports and disable caching.
config.consider_all_requests_local = true
config.action_controller.perform_caching = false
# Don't care if the mailer can't send.
config.action_mailer.raise_delivery_errors = false
# Print deprecation notices to the Rails logger.
config.active_support.deprecation = :log
# Raise an error on page load if there are pending migrations
# config.active_record.migration_error = :page_load
# Debug mode disables concatenation and preprocessing of assets.
# This option may cause significant delays in view rendering with a large
# number of complex assets.
config.assets.compile = true
config.serve_static_assets = true
config.assets.debug = false
config.assets.digest = true
# config.assets.configure do |env|
# env.cache = ActiveSupport::Cache.lookup_store(:null_store)
# end
# config.middleware.use Rack::Prerender
config.root_url = 'lvh.me:5000'
config.api_host = 'http://lvh.me:3000'
结果:js错误,app未加载.
JS错误:
(anonymous function) MINERR_ASSET:22
(anonymous function) angular.js:3650
q angular.js:303
e angular.js:3616
$b angular.js:3556
Zb.c angular.js:1299
Zb angular.js:1314
Tc angular.js:1263
(anonymous function) angular.js:20555
a angular.js:2342
(anonymous function) angular.js:2613
q angular.js:310
Zc.c angular.js:2612
浏览器中的js文件:
console.log( ... );
//= require angular-rails-templates
//= require honeybadger.min
//= require_tree ./dependencies
//= require lodash.min
//= require polyglot.min
//= require lunr.min
//= require angulartics.min
//= require angulartics-ga.min
//= require ./angular_js/fancyinput_library/ac-fancy-input
//= require angular-main
//= require_tree ./angular_js
//= require_tree ../templates
;
更新2:我几乎得到了它.我注意到我没有在正确的文件中包含depend_on方法.我将它们移动到相关的.js.erb并开始工作.我唯一剩下的问题是我必须刷新页面两次.我认为如果application.js保持不变,那就更好了. 🙂
最佳答案 这里有一些问题.
第一:
我相信你误解了rails默认情况下如何处理生产中的资产.
在生产中,资产将被预编译一次,就是这样.回到生产中的资产管道通常是不明智的,这就是为什么你在/config/environments/production.rb中看到这个:
# Do not fallback to assets pipeline if a precompiled asset is missed.
config.assets.compile = false
因此,您的Sprockets指令在生产中不会起作用 – 默认情况下是约定的;并且,有充分理由不让您的生产服务器回退到资产管道.
第二:
您不需要编写自己的DirectiveProcessor来完成您想要实现的目标.您需要做的就是将其添加到依赖文件的顶部(即:application.js):
//= depend_on en.yml
这到你的/config/application.rb:
config.assets.paths << Rails.root.join("config", "locales")
Sprocket将检查该文件是否有变化.
此外,如果您决定通过编写自己的方法来执行此操作,请将它们注入Environment#context_class,如下所述:https://github.com/sstephenson/sprockets/blob/0d47a4fb459b170f2b2db7386ce7cbf9af1aa590/lib/sprockets/context.rb#L9-L22
第三:
你真的不应该在js.erb文件中使用i18n!即使你不关心代码气味,也可以考虑不要在生产中启用config.assets.compile,因为你会受到很大的性能影响.
更好的解决方案
可以在这个答案中找到:Rails: Internationalization of Javascript Strings?
然而:
为了完整起见,这是一个在您添加上述更改后将在开发中工作的示例:
/config/environments/development.rb
PartnerUrlApp::Application.configure do
# Settings specified here will take precedence over those in config/application.rb.
# In the development environment your application's code is reloaded on
# every request. This slows down response time but is perfect for development
# since you don't have to restart the web server when you make code changes.
config.cache_classes = false
# Do not eager load code on boot.
config.eager_load = false
# Show full error reports and disable caching.
config.consider_all_requests_local = true
config.action_controller.perform_caching = false
# Don't care if the mailer can't send.
config.action_mailer.raise_delivery_errors = false
# Print deprecation notices to the Rails logger.
config.active_support.deprecation = :log
# Raise an error on page load if there are pending migrations
config.active_record.migration_error = :page_load
config.assets.compile = true
config.serve_static_assets = true
config.assets.digest = true
# Email
config.action_mailer.default_url_options = { :host => 'localhost:3000' }
# Debug mode disables concatenation and preprocessing of assets.
# This option may cause significant delays in view rendering with a large
# number of complex assets.
config.assets.debug = false
end
/app/assets/application.js.erb
<%= depend_on "en.yml" %>
<% I18n.backend.send(:init_translations) unless I18n.backend.initialized? %>
console.log(<%= I18n.backend.send(:translations).to_json %>);
/config/locales/en.yml
en:
hello: "Hello world"
现在,加载我们的应用程序,我们在控制台中看到:
...
Started GET "/assets/application-240790de490ac241985d22ea6d94de38.js" for 127.0.0.1 at 2014-07-23 18:45:04 -0500
...
然后,更改yaml文件,并保存:
/config/locales/en.yml
en:
hello: "DONT DO THIS!"
并且,在不重新启动服务器的情况下,我们可以看到由于我们的依赖性而重新编译了javascript:
...
Started GET "/assets/application-ddd20afc0453d275b63d846fee2a5fed.js" for 127.0.0.1 at 2014-07-23 18:45:24 -0500
...