Hatena::ブログ(Diary)

130単位

2013-11-24

Rails3.2 -> Rails4.0 アップグレード

2ヶ月遅れくらいで記事書いてます。実行時はRails4.0.0でしたが、4.0系であれば同様の手順でいけると思います。エラーで修正必須か非推奨警告のみかは曖昧だったりします。

Gemfile

#gem 'rails', '~> 3.2'
gem 'rails', '~> 4.0'
gem 'activerecord-session_store'

Rails

rake rails:update
  • bin 以下にrailsなどの実行ファイル
  • config以下は上書きされるので diff して必要な設定を書き戻し
  • config/initializers/filter_parameter_logging.rb 追加
  • config/initializers/secret_token.rb
    • secret_token -> secret_key_base
rake rails:update 以外のファイル
  • update
  • add
    • README.rdoc
    • app/controllers/concerns
    • app/models/concerns
  • remove
ApplicationController
  • protect_from_forgery
    • generateされるものは with: :exception になっており、通常はこのオプションがよい
    • :with オプションを指定しない場合は :null_session
Routing
  • :via 指定なしの match をなくす
  • put -> patch
    • 変更した場合はViewでlink_toの:method指定も :patch にする
正規表現
  • 意図しないマッチを避けるため ^ よりも \A、$ よりも \z か \Z を使う
ProtectedAttributes
  • Model から attr_accessible 削除
  • save/create の without_protection 削除
StrongParameters
  • 利用したほうがよいが、一時的に無効化する場合の設定
    • config.action_controller.permit_all_parameters = true
Scope / Conditioned associations
  • whereなどの条件をlambdaの中で指定
ActiveRecord::Base.all
  • Model.scoped -> Model.all
    • all が AR::Relation を返すようになった
Where condition
  • whereで関連先の条件を文字列で指定する場合は references(:table_name) が必要
Associationの細かい仕様変更
@blog.posts.size #=> 0
@blog.posts.build
@blog.posts.pop
@blog.posts.size #=> 0(Rails3) 1(Rails4)
Data attributes in view
= submit_tag 'submit', confirm: 'OK?', disable_with: 'processing...'
= submit_tag 'submit', data: { confirm: 'OK?', disable_with: 'processing...' }
Exception name

Gems

  • MetaSearch -> Ransack
    • MetaSearchはRails4で動かない
    • 依存度により移行はそれなりに大変で、そのうち別記事で書くかも
  • Spork -> Spring
    • 流行り/設定簡略化
  • DatabaseCleaner -> DatabaseRewinder
    • 流行り/速度改善 (※Ruby2.0のみ)

More information


4774155071
WEB+DB PRESS Vol.73

2013-10-15

Rails3.0 -> Rails3.2 アップグレード

今さら需要があるかわからない3.2へのアップグレード情報です。半年前にはほぼ準備完了していたんですが、諸事情あった末にようやく調整ができたので、先日アップグレードしました。ちなみにRails4リリース後のセキュリティメンテナンス対象は3.2系のみであるため、3.1系以前を運用されている方はできるだけアップグレードしたほうがいいと思います。

Gitのlogを見ながら書き起こしているため、エラーか非推奨警告かは曖昧な上に、もしかしたらバージョンアップ関係ない点もあるかもしれませんがご了承ください。

Gemfile

#gem 'rails', '~> 3.0'
gem 'rails', '~> 3.2'
#gem 'mysql2', '< 0.3'
gem 'mysql2'
gem 'devise-encryptable'
#gem 'jpmobile', '< 2.0'
gem 'jpmobile'
#gem 'spork', '> 0.9.0.rc'
#gem 'guard', '~> 0.8.8'
  • 古いバージョン指定を除外(コメントアウト分が3.0用)
  • DeviseでRestful Authentication互換のEncryptorを利用しているのでDevise Encyptable追加

Rails

rake rails:update
  • config以下が3.2のデフォルトで上書きされる
  • git diff で3.0の内容と比較しながら設定
config.assets.enabled = false
  • asset pipeline をオフにして3.0時代のasset管理を継続
has_many_association#clear
# has_many :posts
has_many :posts, :dependent => :delete_all
  • 3.0は @user.posts.clear = @user.posts.delete_all だった
  • 3.2は :dependent を指定しないと 関連idを NULL で UPDATE する
    • 関連idがNULL不可の場合、:dependent を :delete_all (または :destroy) にする
Rails.cache with specific instances
config.eager_load_paths += %W[#{config.root}/lib]
config.after_initialize do
  require_dependency 'my_class' unless defined? MyClass
end
MimeType
  • config/initializers/mime_types.rb でPDF追加してたけど不要になった

Gems

Devise
<%#= confirmation_url(@resource, :confirmation_token => @resource.confirmation_token) %>
<%= confirmation_url(@resource, :confirmation_token => @token) %>
#User.__send__(:generate_token, 'encrypted_password').slice(0, 8)
Devise.friendly_token.slice(0, 8)
  • ランダム文字列生成
RSpec(Guard)
#guard 'rspec', :version => 2, :cli => '--fail-fast --drb' do
guard 'rspec', :cli => '--fail-fast --drb' do
  • :version 指定不要
Capybara
  • git mv spec/requests spec/features
  • Capybara2系の仕様により、Capybara::DSL を使うspecをfeaturesへ移動
#select @datetime.month.to_s, :from => 'created_at_2i'
select "#{@datetime.month}", :from => 'created_at_2i'
#select @datetime.hour.to_s, :from => 'created_at_4i'
select '%02d' % @datetime.hour, :from => 'created_at_4i'
  • optionのテキスト検出が厳格になった
#click_button 'resource_submit'
click_button '登録する'
  • FormBuilder で submit の id が付かなくなった
Fabrication
  • resource!{ ... } -> resource{ ... }
  • sequence はブロック化して遅延評価
  • :from => Resource -> :class_name => :resource

感想

そもそもアップグレードが遅れたのは、非エンジニアがpublic以下を編集することが多いアプリで、asset pipeline対応ができなかったのが原因でした。ただ対応しないという判断で割り切ってしまえば、2系から3系よりは、対象項目が少なかった印象です。またテストを書いていたため、(テスト自体の修正もあったものの)比較的安心して進めることができました。Model.pluckが使えるようになったのが地味にうれしいですね。


4844331566
改訂新版 基礎Ruby on Rails (IMPRESS KISO SERIES)

関連記事

2011-06-09

Rails2アプリをRails3.0系にアップグレード

Rails2のアプリをRails3にアップグレードしました。テストが無いと大変と聞いていましたが、便利なプラグインのおかげで意外とスムーズにできた気がします。

対象アプリ

  • Ruby1.8.7
  • Rails2.3.5
  • Git管理
  • Model数18
  • テストなし

以下の構成にします。

  • Ruby1.9.2
  • Rails3.0.7

参考リンク

ASCIIcasts(Railscasts)の手順に沿えばほぼ問題なくいけるかと思います。

以下、細かいことも含め自分がやった作業のメモです。

準備

アップグレード用プラグインインストール
rvm system #またはrvm 1.8.7
script/plugin install git://github.com/rails/rails_upgrade.git
アップグレード準備
rake rails:upgrade:check #Deprecatedなどチェックして対象ファイル一覧を標準出力
rake rails:upgrade:backup #主要ファイルをバックアップ

Rails3化

rvm 1.9.2
gem install rails
rails new .

基本的には rake rails:upgrade:check で出るものがなくなるように修正しつつ、動作確認していきます。またdevelopmentモードのWEBrickのログにも「DEPRECATION WARNING」と出るので修正していきます。

Deprecated対応

ActiveRecord周り

Soon-to-be-deprecated ActiveRecord calls

Methods such as find(:all), find(:first), finds with conditions, and the :joins option will soon be deprecated.

More information: http://m.onkey.org/2010/1/22/active-record-query-interface

  • where() をつかう

named_scope is now just scope

The named_scope method has been renamed to just scope.

More information: http://github.com/rails/rails/commit/d60bb0a9e4be2ac0a9de9a69041a4ddc2e0cc914

Updated syntax for validate_on_* methods

Validate-on-callback methods (validate_on_create/validate_on_destroy) have been changed to validate :x, :on => :create

More information: https://rails.lighthouseapp.com/projects/8994/tickets/3880-validate_on_create-and-validate_on_update-no-longer-seem-to-exist

  • validateメソッド、validate_on_*メソッドは廃止
  • validate do ... end のブロックにした
View周り

Deprecated ERb helper calls

Block helpers that use concat (e.g., form_for) should use <%= instead of <%. The current form will continue to work for now, but you will get deprecation warnings since this form will go away in the future.

More information: http://weblog.rubyonrails.org/

  • form_forにイコール追加
find app/views/ -type f | xargs sed -i 's/<% form/<%= form/g'
  • hメソッド不要に
find app/views/ -type f | xargs sed -i 's/ h / /g'

ActionMailer

Deprecated ActionMailer API

You're using the old ActionMailer API to send e-mails in a controller, model, or observer.

More information: http://lindsaar.net/2010/1/26/new-actionmailer-api-in-rails-3

  • modelsからmailersへ
  • Mailerの各メソッドでmailメソッドを利用、Viewへはインスタンス変数で渡す
  • 呼び出し時のメソッド名変更 deliver_* -> .deliver

プラグイン

Restful Authentication
rm -rf vendor/plugins/restful_authentication
rails plugin install git://github.com/Satish/restful-authentication.git restful_authentication
Paperclip
port install imagemagick #Mac
yum install ImageMagick-devel #RedHat
apt-get install libmagickwand-dev #Debian
  • Gemfileに追記して bundle install
gem 'rmagick'
gem 'paperclip'

その他

  • config/initializers/new_rails_defaults.rb削除
  • database.yml編集
    • adapterをmysqlからmysql2に変更
  • 日本語を利用しているrbファイルにマジックコメント追加
    • 一括置換(MacだとうまくいかなかったのでLinuxでやった)
find app/controllers app/models app/helpers -name "*.rb" | xargs sed -i '1s/^/# coding: utf-8\n/'
match ':controller(/:action(/:id))', :controller => /subdir\/[^\/]+/
#return NKF.nkf('-U -s ' , str).gsub(/\n/,"\n\r").gsub(",",":")
return str.to_s.encode("sjis", "utf-8").gsub(/\n/,"\n\r").gsub(",",":")
#CSV::Writer.generate(output = "") do | csv |
CSV.generate(output = "") do | csv |

アップグレード用プラグイン削除

rails plugin remove rails_upgrade

4774146633
Ruby on Rails 3 アプリケーションプログラミング

関連記事

2009-12-11

WordPress .maintenanceファイルでアクセス制限

.htaccessやApacheの設定を変更せず、プラグインも使用せずに、WordPressをアクセス制限する方法を調べていました。テストなどの段階で切り替えの頻度が多くなることを想定した場合、より単純な作業で済ませられるようにしたいと思ったのがきっかけです。

プラグインを使わないで、ワードプレスをメンテナンスモードにする方法 - ミショニポー
http://d.hatena.ne.jp/tenman/20090908/p1

こちらを参考に。要は、WordPressの自動アップグレードの処理を利用するかたちです。そのためバージョン2.7以上が対象になります。

アクセス制限のやり方

<?php
$upgrading = time();
  • 上記内容で「.maintenance」という名前のファイルを作成
  • ファイルをWordPressのルートディレクトリに配置

これだけです。

すこし解説

WordPressコアの、該当処理のコードです。

<?php //wp-settings.php L114-143 (※WordPress MU 2.8.6)
if ( file_exists(ABSPATH . '.maintenance') && !defined('WP_INSTALLING') ) {
    include(ABSPATH . '.maintenance');
    // If the $upgrading timestamp is older than 10 minutes, don't die.
    if ( ( time() - $upgrading ) < 600 ) {
        if ( file_exists( WP_CONTENT_DIR . '/maintenance.php' ) ) {
            require_once( WP_CONTENT_DIR . '/maintenance.php' );
            die();
        }

        $protocol = $_SERVER["SERVER_PROTOCOL"];
        if ( 'HTTP/1.1' != $protocol && 'HTTP/1.0' != $protocol )
            $protocol = 'HTTP/1.0';
        header( "$protocol 503 Service Unavailable", true, 503 );
        header( 'Content-Type: text/html; charset=utf-8' );
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Maintenance</title>

</head>
<body>
    <h1>Briefly unavailable for scheduled maintenance. Check back in a minute.</h1>
</body>
</html>
<?php
        die();
    }
}

1つ目のif条件式で.maintenanceというファイルの存在を判別しています。このファイルは自動アップグレード中に生成される仕組みになっているので、手動でつくってしまえばよいことになります。

.maintenanceの中身では、変数$upgradingにタイムスタンプを代入しています(アップグレード時における生成はWP_Upgrader#maintenance_mode()*1に書かれています)。これで2つ目のif条件式が通り、ステータス503のメンテナンス表示になります。

切り替えの際は、.maintenanceファイルを移動するか、ファイル名変更で良いはずです。

でもまぁ結局のところ、作業量的にはわずかに減った程度ですかねー。

関連リンク

メンテナンス中画面を出す正しい作法と.htaccessの書き方 | Web担当者Forum
http://web-tan.forum.impressrd.jp/e/2009/06/16/5880

WordPressでメンテナンス中や工事中のページを表示する - ミblog : レビューや日常など
http://www.meblog.info/1073.html

関連記事:
WordPress プログラムからテストデータ作成 - 130単位
WordPress SQLのエラー出力を自動化 - 130単位

*1:wp-admin/includes/class-wp-upgrader.php

2009-12-10

Thunderbird3.0でLightningナイトリービルドを利用

Mozilla Thunderbird 3.0 リリースノート
http://mozilla.jp/thunderbird/3.0/releasenotes/

Thunderbird 3.0がリリースされました。

アップグレードしてみたところ、スケジューラのアドオン「Lightning」が対応してなくて使えなくなってました。

てことで、Lightningのベータ版的なものがないか探してみたら、以下のアドオンを発見しました。

Lightning Nightly Updater (Unofficial) :: Add-ons for Thunderbird
https://addons.mozilla.org/ja/thunderbird/addon/4623

ナイトリービルド版のダウンロードをサポートするアドオンのようです。

手順

※非公式のアドオンを利用しますので、以下の手順の実行は各自の責任でご判断ください

Lightning Nightly Updaterのインストール
  • 上記サイトよりLightning Nightly Updaterアドオンをダウンロード
  • メニューの「ツール」→「アドオン」クリック
  • 「インストール」クリックでDLしたxpiファイルを選択してインストール
  • Thunderbird再起動
Lightningナイトリービルドのインストール
  • メニューの「ヘルプ」→「Check for Latest Lightning Nightly Builds」クリック
    f:id:deeeki:20091210125702j:image
  • 最新版の情報が表示されるので、問題がなければ「Install」クリック
    f:id:deeeki:20091210125703j:image
  • インストール作業が完了したらThunderbird再起動

タブバーの右側にカレンダーとタスクが追加されています。設定内容も問題なく再現されました。

f:id:deeeki:20091210125704j:image

カレンダーはWeb上に保存して利用しているのですが、読み込み処理が以前よりも高速になっているような気がします。カレンダーの追加などは、まだ試していません。

【追記】カレンダーの追加も問題ありませんでした。あと、アドオンによるメニューなどは英語表記になっていますが、カレンダーやタスクの内容は問題なく日本語表示されます。