分享

ActiveScaffold本地化

 周巍的森林 2011-09-16
ActiveScaffold  真是优秀的一款ROR插件,其中的live_search支持中文,这点很酷。。。下午用了一会时间实现了ActiveScaffold加localization插件中文化Rails应用。关于localization插件的安装和使用,请参考下面文章
[url]http://blackanger.blog.51cto.com/140924/28824[/url]
值得注意的是,active_scaffold允许你整合自己喜欢的本地化插件,localization只是其中之一。
1。ActiveScaffold提供了整合国际化插件的接口,在application.rb中,底部,写入:
class Object
  def as_(string, *args)
    _(string,*args)
  end
end
2。工程根目录下新建lang目录,建立de_ZH.rb文件:
Localization.define('de_ZH') do |l|
l.store "Reset", "重置"
l.store "Search","搜索"
l.store "Create New","新建"
l.store "Users","用户"
..... ........
end
3。还是application.rb中:
Localization.lang = 'de_ZH'
 4。environment.rb中:
Rails::Initializer.run do |config|
    config.plugins = ['localization']
    Dir.entries("#{RAILS_ROOT}/vendor/plugins/").each { |dir| 
    config.plugins.push("#{dir}") if (File.directory?("#{RAILS_ROOT}/vendor/plugins/#{dir}/lib")  or File.exist?("#{RAILS_ROOT}/vendor/plugins/#{dir}/init.rb")) 
  }
end
启动服务器。。。OK!
http://blackanger.blog.51cto.com/140924/40548

activescaffold+rails2.3.4+本地化 记录

这两天把原有一个项目从rails 2.2.2升级到了rails 2.3.4,在activescaffold插件上耗费了许多时间,但总算都解决了。
1.升级activescaffold
  首先要说明的是AS的官网很是诡异。里面的文档几乎不更新,反而github wiki上才是最新的。所以大家不要找错地方了。
   按照文档,升级AS到2.3版本需要以下两步:
   1). ruby script/plugin install git://github.com/activescaffold/active_scaffold.git
   2). ruby script/plugin install git://github.com/ewildgoose/render_component.git -r rails-2.3

  但是注意: 第二步安装的render_component插件在rails 2.3.4上并不能使用。启动时会出现 无效的方法"set_session_options"的错误。我最后是在github上找了另一个render_component插件才好的。在这里浪费了我至少2个小时。

   2). ruby script/plugin install git://github.com/weplay/render_component.git

2.中文化

  原来我使用的是localization插件。并在Object类中加入了as_()方法来实现中文化。可是此插件在rails 2.3.4中也会报错。于是我就直接采用rails自带的I18n国际化方法。当然还是需要加入as_()方法.代码如下

 

Ruby代码  收藏代码
  1. class Object  
  2.   def as_(string, *args)  
  3.     if string  
  4.       r = I18n.t(string,*args)  
  5.       if (r =~ /^translation missing/)  
  6.         return string  
  7.       end  
  8.       return r  
  9.     else  
  10.       return string  
  11.     end  
  12.   rescue  
  13.     return string  
  14.   end  
  15. end 

   附上翻译文件:


rails 2.3.2 解惑(持续更新中)

1.在app\view\layouts如果有两个以application.html.erb开头的文件,比如

application.html.erb, application.html.erb.bak

rails 2.3.2会因无法确定而都不引用.


2.旧代码若迁移到2.3.2,会出现找不到application controller.

其实不是不见了,而是默认会去寻找application_controller.rb.

所以把app\controller下的application.rb改名为application_controller.rb即可.

3.在2.0.2版本上,render 'layout\some_layout'是可以运行的,
但在2.3.2要改成 render :file=> 'layout\some_layout'

http://sinkzephyr./blog/412740


环境:Ruby 1.9.1+Rails2.3.2+ActiveScaffold 1.2RC1,错误提示:

Encoding::CompatibilityError

incompatible character encodings: ASCII-8BIT and UTF-8

 

这个问题会有两种情况导致:

1、问题环境:模板中有<%="汉字"%>,且有UTF-8的字串变量,如I18n.t(:hello)返回的是UTF-8串。

      问题所在:Ruby 1.9.1的ERB处理编码的方式,看代码erb.rb

 

def compile(s)
      enc = s.encoding
      raise ArgumentError, "#{enc} is not ASCII compatible" if enc.dummy?
      s = s.dup.force_encoding("ASCII-8BIT") # don't use constant Enoding::ASCII_8BIT for miniruby
      enc = detect_magic_comment(s) || enc

.....

 

这样,s的编码是"ASCII-8BIT",模板就是ASCII-8BIT编码,当有UTF-8的字串变量concat时,出错。

      解决方案:在 enc = detect_magic_comment(s) || enc 后添加一行 s.force_encoding(enc)

2、问题环境:数据库返回UTF-8的数据时,ActiveScaffold的列表以及查看出错。

      问题所在:ActiveRecord返回的数据,编码成了ASCII-8BIT,看代码list_column_helps.rb,

def format_value(column_value, options = {})
        if column_empty?(column_value)
          active_scaffold_config.list.empty_field_text
        elsif column_value.is_a?(Time) || column_value.is_a?(Date)
          l(column_value, :format => options[:format] || :default)
        else
          column_value.to_s
        end
      end

我查到这里返回的值就是ASCII-8BIT编码了。查了下,从mysql_adapater出来的数据就是ASCII-8BIT的。

     解决方案:大家给点建议吧,SET NAME无效、database.yml的encoding无效。我最后是修改mysql_adapter

 

    def select(sql, name = nil)
          @connection.query_with_result = true
          result = execute(sql, name)
          rows = result.all_hashes
          result.free

 

#以下为新加部分

 

          if @config[:encoding] && @config[:encoding]=="utf8"
            rows.each do |row|
              row.each do |key, value|
                if (value.class == String)
                  value.force_encoding("UTF-8")
                end
              end
            end
          end
#以上为新加部分
          rows
        end

http://www./topic/355909




最主要的提示是说:

Ruby代码  收藏代码
  1. uninitialized constant ApplicationController  
  2. c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:443:in `load_missing_constant'  
  3. c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:80:in `const_missing'  
  4. c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:92:in `const_missing'  
  5. F:/ROR_SPACE/edepot/app/controllers/store_controller.rb:9  


而去store_controller.rb去看

Ruby代码  收藏代码
  1. class StoreController < ApplicationController  

也就是说找不到application.rb的定义,而当前的文件又确实有application.rb的定义。问题在那里呢?

原来是rails升级以后,application.rb默认文件名改了。这或者是“约定高于配置”的另一面,有人改了约定,我们还不太清楚。那么好吧,我把application.rb的文件名改成application_controller.rb。
接着想要运行,或者,还有一些东西要改cnfig/boot.rb里,那个典型的require_gem问题。

Ruby代码  收藏代码
  1. else  
  2.   gem "rails"  
  3.   #require_gem "rails"  
  4.   require 'initializer'  


然后,运行时有点升级

Ruby代码  收藏代码
  1. F:\ROR_SPACE\depot_l>rake db:migrate  
  2. (in F:/ROR_SPACE/depot_l)  
  3. rake aborted!  
  4. undefined method `require_gem' for main:Object  
  5. F:/ROR_SPACE/depot_l/rakefile:4  
  6. (See full trace by running task with --trace)  
  7.   
  8. F:\ROR_SPACE\depot_l>rake db:migrate  
  9. (in F:/ROR_SPACE/depot_l)  
  10. Your config/boot.rb is outdated: Run "rake rails:update".  
  11.   
  12. F:\ROR_SPACE\depot_l>rake rails:update  
  13. (in F:/ROR_SPACE/depot_l)  
  14. install -c -m 0755 c:/ruby/lib/ruby/gems/1.8/gems/rails-2.3.2/lib/tasks/../../bin/dbconsole script/dbconsole  
  15. F:/ROR_SPACE/depot_l/app/controllers/application.rb has been renamed to F:/ROR_SPACE/depot_l/app/controllers/application_controller.rb, update your SCM as necessary  

这段说明也表明,文件名改了。

Html代码  收藏代码
  1. uninitialized constant FileColumn::ClassMethods::Inflector  


如果你还有classic_paginate

那么,请记着也要改这个

Ruby代码  收藏代码
  1. options[:singular_name] ||= ActiveSupport::Inflector.singularize(collection_id.to_s)     
  2. options[:class_name]  ||= ActiveSupport::Inflector.camelize(options[:singular_name])     
  3. #      options[:singular_name] ||= Inflector.singularize(collection_id.to_s)     
  4. #      options[:class_name]  ||= Inflector.camelize(options[:singular_name])    
分享到:  
评论
11 楼 utensil 2009-04-15   引用
robbin 写道
每次升级Rails都有点心惊肉跳的,不单纯是这些不兼容的文件修改,而是很多不实际上线运行发现不了的新问题。


Robbin何不依据自己对Rails的修改,在Github上做一个兼容性和稳定性更好的fork?这样不仅方便大家,而且可以方便地pull回Rails。
10 楼 richyzhang 2009-03-25   引用
rainux 写道
yangzhihuan 写道
rainux 写道
yangzhihuan 写道
我的解决方法是:
新建一个Rails 2.3.2的工程,把boot.rb文件拷贝过去旧工程中.
然后执行一下 rake rails:update
基本上就搞定了.


没有必要创建一个新工程吧,直接在 config/environment.rb 里把 Rails 版本号改成 2.3.2 之后执行 rake rails:update 即可更新所有的文件,包括 application.rb 自动改名。


我一开始就是这样干的,但是执行rake的时候会提示 boot.rb 有错的.


我从 Rails 2.2.2 升级上来的,没有问题。可能是因为你原来的 Rails 版本比较老。


用自动升级应该跟mysql类似,就是一个版本一个版本的upgrade,这样的话麻烦会少很多.
9 楼 rainux 2009-03-25   引用
yangzhihuan 写道
rainux 写道
yangzhihuan 写道
我的解决方法是:
新建一个Rails 2.3.2的工程,把boot.rb文件拷贝过去旧工程中.
然后执行一下 rake rails:update
基本上就搞定了.


没有必要创建一个新工程吧,直接在 config/environment.rb 里把 Rails 版本号改成 2.3.2 之后执行 rake rails:update 即可更新所有的文件,包括 application.rb 自动改名。


我一开始就是这样干的,但是执行rake的时候会提示 boot.rb 有错的.


我从 Rails 2.2.2 升级上来的,没有问题。可能是因为你原来的 Rails 版本比较老。
8 楼 yangzhihuan 2009-03-25   引用
rainux 写道
yangzhihuan 写道
我的解决方法是:
新建一个Rails 2.3.2的工程,把boot.rb文件拷贝过去旧工程中.
然后执行一下 rake rails:update
基本上就搞定了.


没有必要创建一个新工程吧,直接在 config/environment.rb 里把 Rails 版本号改成 2.3.2 之后执行 rake rails:update 即可更新所有的文件,包括 application.rb 自动改名。


我一开始就是这样干的,但是执行rake的时候会提示 boot.rb 有错的.
7 楼 yehs220 2009-03-24   引用
QuakeWang 写道

另外还有一些小改动,比如将原先自己写的对rails动态内容输出做gzip压缩,现在可以迁移到rack,用现成的:
Ruby代码  收藏代码
  1. config.middleware.use Rack::Deflater  


怎么样跳过Deflator?比如动态生成的图片什么的。
6 楼 rainux 2009-03-24   引用
yangzhihuan 写道
我的解决方法是:
新建一个Rails 2.3.2的工程,把boot.rb文件拷贝过去旧工程中.
然后执行一下 rake rails:update
基本上就搞定了.


没有必要创建一个新工程吧,直接在 config/environment.rb 里把 Rails 版本号改成 2.3.2 之后执行 rake rails:update 即可更新所有的文件,包括 application.rb 自动改名。
5 楼 lgn21st 2009-03-22   引用
我手上的项目也刚刚从2.2.2升级到2.3.2,发现几个稍微复杂一点的关联模型上定义的named_scope执行时报SQL语法错误,花了点时间没有看出问题到底在那里,只能放到明天继续排查原因...
可能是原来在2.2.2上通过但是这么用不对
或者是2.3.2有bug,希望是前者...
4 楼 yangzhihuan 2009-03-22   引用
我的解决方法是:
新建一个Rails 2.3.2的工程,把boot.rb文件拷贝过去旧工程中.
然后执行一下 rake rails:update
基本上就搞定了.
3 楼 wosmvp 2009-03-21   引用
JavaEye果然够激进 
2 楼 QuakeWang 2009-03-21   引用
在迁移JavaEye代码到2.3,已经遇到3个问题了:
1. Cache Sweeper不能正常的auto load,这个ticket号称已经解决,但是还有很多人报告有问题:
http://rails./projects/8994/tickets/1977-actioncontrollercachingsweeper-autoloading-is-broken
解决方案是检查一下你的environment文件中是否有调用ActionContoller或者ActionRecord的代码,导致先它在sweeper之前加载了,JavaEye在Rails 2.2.2的代码有类似如下设置:
Ruby代码  收藏代码
  1. ActionController::Base.session_options[:session_domain] = DEFAULT_ROOT_DOMAIN  
  2. ActionController::Base.asset_host = "http://#{DEFAULT_SITE_DOMAIN}"  

改成通过config设置就正常了:
Ruby代码  收藏代码
  1. config.action_controller.session[:domain] = DEFAULT_ROOT_DOMAIN  
  2. config.action_controller.asset_host = "http://#{DEFAULT_SITE_DOMAIN}"  


2. 新加的Strategy::LocalCache是memory cache的subclass,里面有freeze的代码:@data[name] = value.freeze,导致memcache store的对象全部被freeze
零时解决方案是hack localcache

3. Collection destroy不接受id作为参数了:
http://rails./projects/8994-ruby-on-rails/tickets/2306-associationcollections-destroy-method-is-not-compatible-with-old-version
解决方案是先查询,再调用删除方法。

另外还有一些小改动,比如将原先自己写的对rails动态内容输出做gzip压缩,现在可以迁移到rack,用现成的:
Ruby代码  收藏代码
  1. config.middleware.use Rack::Deflater  


不过2.3感觉在开发环境中比2.2要快很多,和改进的lazy load有关,在生产环境还须再测试对比看看。
1 楼 robbin 2009-03-21   引用
每次升级Rails都有点心惊肉跳的,不单纯是这些不兼容的文件修改,而是很多不实际上线运行发现不了的新问题。

http://hlee./blog/352598

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多