「Ruby on Rails」カテゴリーアーカイブ

undefined method `time_zone='

rails 2.0.2.9216と 2.0.2.9126で新規にアプリケーションを作成すると、実行時にエラーが発生する。

rails trial
cd trial
ruby script/console 
Loading development environment (Rails 2.0.2)
/Users/pistolfly/railsprojects/trial/config/environment.rb:44:NoMethodError: undefined method `time_zone=' for #
/Library/Ruby/Gems/1.8/gems/actionpack-2.0.2/lib/action_controller/dispatcher.rb:88:NoMethodError: undefined method `cattr_accessor' for ActionController::Dispatcher:Class
/Users/pistolfly/railsprojects/trial/app/controllers/application.rb:4:NameError: uninitialized constant ActionController::Base
sudo gem uninstall rails --version 2.0.2.9216

のように新しい順にアンインストールしていき、2.0.2.9053まで戻して新規にプロジェクトを作成したら大丈夫になった。

restful_authenticationの使い方

Home -- restful-authentication -- GitHub

$ ./script/plugin install git://github.com/technoweenie/restful-authentication.git

でrestful-authenticationをインストール後に、
vendor/plugins/restful-authentication

vendor/plugins/restful_authentication
にrenameする。
(ディレクトリ名がrestful-authenticationのままだとエラーになるため)
generatorで--statefulを使うために、acts_as_state_machineをインストールする。
Plugins - Acts As State Machine - Agile Web Development

$ ./script/plugin install http://elitists.textdriven.com/svn/plugins/acts_as_state_machine/trunk

generatorで--rspecを使うために、rspecとrspec-railsをインストールする。

インストール後に、

./script/generate rspec

を忘れずに。
ここまで準備できたら、restful_authenticationのgeneratorを使う。
ZDNet Japan Blog - あとで読むRailsのススメ:restful_authentication
restful_authenticationを触ってみた - idesaku blog

Rails1.2.6のアプリケーションをRails2.0にしたら500 Internal Server Error

ログを見ると、

Status: 500 Internal Server Error
  A secret is required to generate an integrity hash for cookie session data. Use config.action_controller.session = { :session_key => "_myapp_session", :secret => "some secret phrase of at least 30 characters" } in config/environment.rb

ログメッセージにある通り、config/environment.rbのRails::Initializer.runのブロックに以下を追加したら、解決。

Rails::Initializer.run do |config|
  # ...
  # Your secret key for verifying cookie session data integrity.
  # If you change this key, all old sessions will become invalid!
  # Make sure the secret is at least 30 characters and all random, 
  # no regular words or you'll be exposed to dictionary attacks.
  config.action_controller.session = {
    :session_key => '_myproject_session',
    :secret      => '5db14bae2952695dca65b3c176a134d100a5066aa0a31d3af680f39f40fe03fa986c024836158c2ae6e8b4a8036de938fdbc072909d1bf88505c96a8270c7cc7'
  }
  # ... 以下略
end

ActiveRecordにセッションを格納するようにしたらエラー

セッションストアにActiveRecordを使用するには、environment.rbで以下の箇所のコメントを外す。

  config.action_controller.session_store = :active_record_store

セッション格納用のテーブルは、

rake db:sessions:create
rake db:migrate

で作成。
セッションストアにActiveRecordを使用するようにしたら、以下のエラーが発生。
No :secret given to the #protect_from_forgery call. Set that or use a session store capable of generating its own keys (Cookie Session Store).
application.rbで以下の箇所の:secretのコメントを外したら解決。

  # See ActionController::RequestForgeryProtection for details
  # Uncomment the :secret if you're not using the cookie session store
  protect_from_forgery # :secret => '7136b0968f24e7318da7eb62e50d05b7'

active_record_store sessions does not pass a :secret to #protect_from_forgery in Rails 2.0.0 Preview - Ruby Forum

Rails2.0とruby-gettext

Using ruby-gettext with Edge Rails - zargony.com
Rails2.0でruby-gettextを使うと、
・500 Internal Server Errorが発生する。
・Rails2.0の新しいテンプレート *.html.erbのような*.xxx.erb を認識しない。
上記リンク先に解決方法が記載されている。
・500 Internal Server Errorは、rubyのバージョンを1.8.6-p26以降に上げると解決。
・*.xxx.erbについては、lib/tasks/gettext.rakeを以下のように修正する。
※Ruby-GetText-Package-1.90.0でRuby on Rails 2.0に対応して、デフォルトで.erbがERBファイルとして認識されるようになったため、下記対策は不要となった。
よたらぼ(2008-02-03)

require 'gettext/utils'
# Tell ruby-gettext's ErbParser to parse .erb files as well
# See also http://zargony.com/2007/07/29/using-ruby-gettext-with-edge-rails/
GetText::ErbParser.init(:extnames => ['.rhtml', '.erb'])
desc 'Update pot/po files'
task :updatepo do
  GetText.update_pofiles('messages', Dir.glob("{app,lib}/**/*.{rb,rhtml,erb,rjs}"), 'MyApp')
end
desc 'Create mo-files'
task :makemo do
  GetText.create_mofiles(true, 'po', 'locale')
end