ActiveScaffold 真是優(yōu)秀的一款ROR插件,
其中的live_search支持中文,這點很酷。。。下午用了一會時間實現(xiàn)了ActiveScaffold加localization插件中文化Rails應(yīng)用。關(guān)于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") orFile.exist?("#{RAILS_ROOT}/vendor/plugins/#{dir}/init.rb"))
}
end
啟動服務(wù)器。。。OK!
http://blackanger.blog.51cto.com/140924/40548
activescaffold+rails2.3.4+本地化 記錄這兩天把原有一個項目從rails 2.2.2升級到了rails 2.3.4,在activescaffold插件上耗費了許多時間,但總算都解決了。
1.升級activescaffold
首先要說明的是AS的官網(wǎng)很是詭異。里面的文檔幾乎不更新,反而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上并不能使用。啟動時會出現(xiàn) 無效的方法"set_session_options"的錯誤。我最后是在github上找了另一個render_component插件才好的。在這里浪費了我至少2個小時。
2). ruby script/plugin install git://github.com/weplay/render_component.git
2.中文化
原來我使用的是localization插件。并在Object類中加入了as_()方法來實現(xiàn)中文化。可是此插件在rails 2.3.4中也會報錯。于是我就直接采用rails自帶的I18n國際化方法。當(dāng)然還是需要加入as_()方法.代碼如下
- class Object
- def as_(string, *args)
- if string
- r = I18n.t(string,*args)
- if (r =~ /^translation missing/)
- return string
- end
- return r
- else
- return string
- end
- rescue
- return string
- end
- end
附上翻譯文件:
1.在app\view\layouts如果有兩個以application.html.erb開頭的文件,比如
application.html.erb, application.html.erb.bak
rails 2.3.2會因無法確定而都不引用.
2.舊代碼若遷移到2.3.2,會出現(xiàn)找不到application controller.
其實不是不見了,而是默認(rèn)會去尋找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.iteye.com/blog/412740
環(huán)境:Ruby 1.9.1+Rails2.3.2+ActiveScaffold 1.2RC1,錯誤提示:
Encoding::CompatibilityError
incompatible character encodings: ASCII-8BIT and UTF-8
這個問題會有兩種情況導(dǎo)致:
1、問題環(huán)境:模板中有<%="漢字"%>,且有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編碼,當(dāng)有UTF-8的字串變量concat時,出錯。
解決方案:在 enc = detect_magic_comment(s) || enc 后添加一行 s.force_encoding(enc)
2、問題環(huán)境:數(shù)據(jù)庫返回UTF-8的數(shù)據(jù)時,ActiveScaffold的列表以及查看出錯。
問題所在:ActiveRecord返回的數(shù)據(jù),編碼成了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出來的數(shù)據(jù)就是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.iteye.com/topic/355909
最主要的提示是說:
- uninitialized constant ApplicationController
- c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:443:in `load_missing_constant'
- c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:80:in `const_missing'
- c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:92:in `const_missing'
- F:/ROR_SPACE/edepot/app/controllers/store_controller.rb:9
而去store_controller.rb去看
- class StoreController < ApplicationController
也就是說找不到application.rb的定義,而當(dāng)前的文件又確實有application.rb的定義。問題在那里呢?
原來是rails升級以后,application.rb默認(rèn)文件名改了。這或者是“約定高于配置”的另一面,有人改了約定,我們還不太清楚。那么好吧,我把application.rb的文件名改成application_controller.rb。
接著想要運行,或者,還有一些東西要改cnfig/boot.rb里,那個典型的require_gem問題。
- else
- gem "rails"
-
- require 'initializer'
然后,運行時有點升級
- F:\ROR_SPACE\depot_l>rake db:migrate
- (in F:/ROR_SPACE/depot_l)
- rake aborted!
- undefined method `require_gem' for main:Object
- F:/ROR_SPACE/depot_l/rakefile:4
- (See full trace by running task with --trace)
-
- F:\ROR_SPACE\depot_l>rake db:migrate
- (in F:/ROR_SPACE/depot_l)
- Your config/boot.rb is outdated: Run "rake rails:update".
-
- F:\ROR_SPACE\depot_l>rake rails:update
- (in F:/ROR_SPACE/depot_l)
- install -c -m 0755 c:/ruby/lib/ruby/gems/1.8/gems/rails-2.3.2/lib/tasks/../../bin/dbconsole script/dbconsole
- 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
這段說明也表明,文件名改了。
- uninitialized constant FileColumn::ClassMethods::Inflector
如果你還有classic_paginate
那么,請記著也要改這個
- options[:singular_name] ||= ActiveSupport::Inflector.singularize(collection_id.to_s)
- options[:class_name] ||= ActiveSupport::Inflector.camelize(options[:singular_name])
-
-
http://hlee.iteye.com/blog/352598
評論
Robbin何不依據(jù)自己對Rails的修改,在Github上做一個兼容性和穩(wěn)定性更好的fork?這樣不僅方便大家,而且可以方便地pull回Rails。
新建一個Rails 2.3.2的工程,把boot.rb文件拷貝過去舊工程中.
然后執(zhí)行一下 rake rails:update
基本上就搞定了.
沒有必要創(chuàng)建一個新工程吧,直接在 config/environment.rb 里把 Rails 版本號改成 2.3.2 之后執(zhí)行 rake rails:update 即可更新所有的文件,包括 application.rb 自動改名。
我一開始就是這樣干的,但是執(zhí)行rake的時候會提示 boot.rb 有錯的.
我從 Rails 2.2.2 升級上來的,沒有問題。可能是因為你原來的 Rails 版本比較老。
用自動升級應(yīng)該跟mysql類似,就是一個版本一個版本的upgrade,這樣的話麻煩會少很多.
新建一個Rails 2.3.2的工程,把boot.rb文件拷貝過去舊工程中.
然后執(zhí)行一下 rake rails:update
基本上就搞定了.
沒有必要創(chuàng)建一個新工程吧,直接在 config/environment.rb 里把 Rails 版本號改成 2.3.2 之后執(zhí)行 rake rails:update 即可更新所有的文件,包括 application.rb 自動改名。
我一開始就是這樣干的,但是執(zhí)行rake的時候會提示 boot.rb 有錯的.
我從 Rails 2.2.2 升級上來的,沒有問題。可能是因為你原來的 Rails 版本比較老。
新建一個Rails 2.3.2的工程,把boot.rb文件拷貝過去舊工程中.
然后執(zhí)行一下 rake rails:update
基本上就搞定了.
沒有必要創(chuàng)建一個新工程吧,直接在 config/environment.rb 里把 Rails 版本號改成 2.3.2 之后執(zhí)行 rake rails:update 即可更新所有的文件,包括 application.rb 自動改名。
我一開始就是這樣干的,但是執(zhí)行rake的時候會提示 boot.rb 有錯的.
另外還有一些小改動,比如將原先自己寫的對rails動態(tài)內(nèi)容輸出做gzip壓縮,現(xiàn)在可以遷移到rack,用現(xiàn)成的:
怎么樣跳過Deflator?比如動態(tài)生成的圖片什么的。
新建一個Rails 2.3.2的工程,把boot.rb文件拷貝過去舊工程中.
然后執(zhí)行一下 rake rails:update
基本上就搞定了.
沒有必要創(chuàng)建一個新工程吧,直接在 config/environment.rb 里把 Rails 版本號改成 2.3.2 之后執(zhí)行 rake rails:update 即可更新所有的文件,包括 application.rb 自動改名。
可能是原來在2.2.2上通過但是這么用不對
或者是2.3.2有bug,希望是前者...
新建一個Rails 2.3.2的工程,把boot.rb文件拷貝過去舊工程中.
然后執(zhí)行一下 rake rails:update
基本上就搞定了.
1. Cache Sweeper不能正常的auto load,這個ticket號稱已經(jīng)解決,但是還有很多人報告有問題:
http://rails.lighthouseapp.com/projects/8994/tickets/1977-actioncontrollercachingsweeper-autoloading-is-broken
解決方案是檢查一下你的environment文件中是否有調(diào)用ActionContoller或者ActionRecord的代碼,導(dǎo)致先它在sweeper之前加載了,JavaEye在Rails 2.2.2的代碼有類似如下設(shè)置:
改成通過config設(shè)置就正常了:
2. 新加的Strategy::LocalCache是memory cache的subclass,里面有freeze的代碼:@data[name] = value.freeze,導(dǎo)致memcache store的對象全部被freeze
零時解決方案是hack localcache
3. Collection destroy不接受id作為參數(shù)了:
http://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/2306-associationcollections-destroy-method-is-not-compatible-with-old-version
解決方案是先查詢,再調(diào)用刪除方法。
另外還有一些小改動,比如將原先自己寫的對rails動態(tài)內(nèi)容輸出做gzip壓縮,現(xiàn)在可以遷移到rack,用現(xiàn)成的:
不過2.3感覺在開發(fā)環(huán)境中比2.2要快很多,和改進的lazy load有關(guān),在生產(chǎn)環(huán)境還須再測試對比看看。