ActiveScaffold 真是優(yōu)秀的一款ROR插件,
其中的live_search支持中文,這點(diǎn)很酷。。。下午用了一會(huì)時(shí)間實(shí)現(xiàn)了ActiveScaffold加localization插件中文化Rails應(yīng)用。關(guān)于localization插件的安裝和使用,請(qǐng)參考下面文章
[url]http://blackanger.blog.51cto.com/140924/28824[/url]
值得注意的是,active_scaffold允許你整合自己喜歡的本地化插件,localization只是其中之一。1。ActiveScaffold提供了整合國(guó)際化插件的接口,在application.rb中,底部,寫(xiě)入:
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
啟動(dòng)服務(wù)器。。。OK!
http://blackanger.blog.51cto.com/140924/40548
activescaffold+rails2.3.4+本地化 記錄這兩天把原有一個(gè)項(xiàng)目從rails 2.2.2升級(jí)到了rails 2.3.4,在activescaffold插件上耗費(fèi)了許多時(shí)間,但總算都解決了。
1.升級(jí)activescaffold
首先要說(shuō)明的是AS的官網(wǎng)很是詭異。里面的文檔幾乎不更新,反而github wiki上才是最新的。所以大家不要找錯(cuò)地方了。
按照文檔,升級(jí)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上并不能使用。啟動(dòng)時(shí)會(huì)出現(xiàn) 無(wú)效的方法"set_session_options"的錯(cuò)誤。我最后是在github上找了另一個(gè)render_component插件才好的。在這里浪費(fèi)了我至少2個(gè)小時(shí)。
2). ruby script/plugin install git://github.com/weplay/render_component.git
2.中文化
原來(lái)我使用的是localization插件。并在Object類(lèi)中加入了as_()方法來(lái)實(shí)現(xiàn)中文化??墒谴瞬寮趓ails 2.3.4中也會(huì)報(bào)錯(cuò)。于是我就直接采用rails自帶的I18n國(guó)際化方法。當(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如果有兩個(gè)以application.html.erb開(kāi)頭的文件,比如
application.html.erb, application.html.erb.bak
rails 2.3.2會(huì)因無(wú)法確定而都不引用.
2.舊代碼若遷移到2.3.2,會(huì)出現(xiàn)找不到application controller.
其實(shí)不是不見(jiàn)了,而是默認(rèn)會(huì)去尋找application_controller.rb.
所以把a(bǔ)pp\controller下的application.rb改名為application_controller.rb即可.
3.在2.0.2版本上,render 'layout\some_layout'是可以運(yùn)行的,
但在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,錯(cuò)誤提示:
Encoding::CompatibilityError
incompatible character encodings: ASCII-8BIT and UTF-8
這個(gè)問(wèn)題會(huì)有兩種情況導(dǎo)致:
1、問(wèn)題環(huán)境:模板中有<%="漢字"%>,且有UTF-8的字串變量,如I18n.t(:hello)返回的是UTF-8串。
問(wèn)題所在: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時(shí),出錯(cuò)。
解決方案:在 enc = detect_magic_comment(s) || enc 后添加一行 s.force_encoding(enc)
2、問(wèn)題環(huán)境:數(shù)據(jù)庫(kù)返回UTF-8的數(shù)據(jù)時(shí),ActiveScaffold的列表以及查看出錯(cuò)。
問(wèn)題所在: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出來(lái)的數(shù)據(jù)就是ASCII-8BIT的。
解決方案:大家給點(diǎn)建議吧,SET NAME無(wú)效、database.yml的encoding無(wú)效。我最后是修改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
最主要的提示是說(shuō):
- 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
也就是說(shuō)找不到application.rb的定義,而當(dāng)前的文件又確實(shí)有application.rb的定義。問(wèn)題在那里呢?
原來(lái)是rails升級(jí)以后,application.rb默認(rèn)文件名改了。這或者是“約定高于配置”的另一面,有人改了約定,我們還不太清楚。那么好吧,我把a(bǔ)pplication.rb的文件名改成application_controller.rb。
接著想要運(yùn)行,或者,還有一些東西要改cnfig/boot.rb里,那個(gè)典型的require_gem問(wèn)題。
- else
- gem "rails"
-
- require 'initializer'
然后,運(yùn)行時(shí)有點(diǎn)升級(jí)
- 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
這段說(shuō)明也表明,文件名改了。
- uninitialized constant FileColumn::ClassMethods::Inflector
如果你還有classic_paginate
那么,請(qǐng)記著也要改這個(gè)
- 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
評(píng)論
Robbin何不依據(jù)自己對(duì)Rails的修改,在Github上做一個(gè)兼容性和穩(wěn)定性更好的fork?這樣不僅方便大家,而且可以方便地pull回Rails。
新建一個(gè)Rails 2.3.2的工程,把boot.rb文件拷貝過(guò)去舊工程中.
然后執(zhí)行一下 rake rails:update
基本上就搞定了.
沒(méi)有必要?jiǎng)?chuàng)建一個(gè)新工程吧,直接在 config/environment.rb 里把 Rails 版本號(hào)改成 2.3.2 之后執(zhí)行 rake rails:update 即可更新所有的文件,包括 application.rb 自動(dòng)改名。
我一開(kāi)始就是這樣干的,但是執(zhí)行rake的時(shí)候會(huì)提示 boot.rb 有錯(cuò)的.
我從 Rails 2.2.2 升級(jí)上來(lái)的,沒(méi)有問(wèn)題??赡苁且?yàn)槟阍瓉?lái)的 Rails 版本比較老。
用自動(dòng)升級(jí)應(yīng)該跟mysql類(lèi)似,就是一個(gè)版本一個(gè)版本的upgrade,這樣的話麻煩會(huì)少很多.
新建一個(gè)Rails 2.3.2的工程,把boot.rb文件拷貝過(guò)去舊工程中.
然后執(zhí)行一下 rake rails:update
基本上就搞定了.
沒(méi)有必要?jiǎng)?chuàng)建一個(gè)新工程吧,直接在 config/environment.rb 里把 Rails 版本號(hào)改成 2.3.2 之后執(zhí)行 rake rails:update 即可更新所有的文件,包括 application.rb 自動(dòng)改名。
我一開(kāi)始就是這樣干的,但是執(zhí)行rake的時(shí)候會(huì)提示 boot.rb 有錯(cuò)的.
我從 Rails 2.2.2 升級(jí)上來(lái)的,沒(méi)有問(wèn)題??赡苁且?yàn)槟阍瓉?lái)的 Rails 版本比較老。
新建一個(gè)Rails 2.3.2的工程,把boot.rb文件拷貝過(guò)去舊工程中.
然后執(zhí)行一下 rake rails:update
基本上就搞定了.
沒(méi)有必要?jiǎng)?chuàng)建一個(gè)新工程吧,直接在 config/environment.rb 里把 Rails 版本號(hào)改成 2.3.2 之后執(zhí)行 rake rails:update 即可更新所有的文件,包括 application.rb 自動(dòng)改名。
我一開(kāi)始就是這樣干的,但是執(zhí)行rake的時(shí)候會(huì)提示 boot.rb 有錯(cuò)的.
另外還有一些小改動(dòng),比如將原先自己寫(xiě)的對(duì)rails動(dòng)態(tài)內(nèi)容輸出做gzip壓縮,現(xiàn)在可以遷移到rack,用現(xiàn)成的:
怎么樣跳過(guò)Deflator?比如動(dòng)態(tài)生成的圖片什么的。
新建一個(gè)Rails 2.3.2的工程,把boot.rb文件拷貝過(guò)去舊工程中.
然后執(zhí)行一下 rake rails:update
基本上就搞定了.
沒(méi)有必要?jiǎng)?chuàng)建一個(gè)新工程吧,直接在 config/environment.rb 里把 Rails 版本號(hào)改成 2.3.2 之后執(zhí)行 rake rails:update 即可更新所有的文件,包括 application.rb 自動(dòng)改名。
可能是原來(lái)在2.2.2上通過(guò)但是這么用不對(duì)
或者是2.3.2有bug,希望是前者...
新建一個(gè)Rails 2.3.2的工程,把boot.rb文件拷貝過(guò)去舊工程中.
然后執(zhí)行一下 rake rails:update
基本上就搞定了.
1. Cache Sweeper不能正常的auto load,這個(gè)ticket號(hào)稱(chēng)已經(jīng)解決,但是還有很多人報(bào)告有問(wèn)題:
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的代碼有類(lèi)似如下設(shè)置:
改成通過(guò)config設(shè)置就正常了:
2. 新加的Strategy::LocalCache是memory cache的subclass,里面有freeze的代碼:@data[name] = value.freeze,導(dǎo)致memcache store的對(duì)象全部被freeze
零時(shí)解決方案是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)用刪除方法。
另外還有一些小改動(dòng),比如將原先自己寫(xiě)的對(duì)rails動(dòng)態(tài)內(nèi)容輸出做gzip壓縮,現(xiàn)在可以遷移到rack,用現(xiàn)成的:
不過(guò)2.3感覺(jué)在開(kāi)發(fā)環(huán)境中比2.2要快很多,和改進(jìn)的lazy load有關(guān),在生產(chǎn)環(huán)境還須再測(cè)試對(duì)比看看。