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

2012-07-24

RailsにおけるRESTfulなURL設計勉強会 メモ #sendagayarb

参加してきました。

以下、粒度にばらつきありますが、気になった点のメモです。ほぼ引用ですが、意図と違う表現になってしまっていたらすみません。

RESTful APIとしてのRailsクライアントとしてのJavaScript (@ppworks)

  • RESTful指向で考えると統一されたインターフェースで、URLを見ただけで何するかわかるのが良い
  • JSはassetsのほうに統一しアクションごとに処理が書けるjQuery-Routerなどを使うと良いのでは
  • RailsはだんだんAPI化していくのではないか
  • 通常のHTTPリクエストと非同期HTTPリクエストを同じ統一インターフェースであるRESTfulな設計で管理すると一貫性が出て開発効率の向上につながる

リソースモデリングパターンの提案 (@tkawa)

RESTful Webアプリの設計レビューの話 (@t_wada)

  • 結論:「REST麻疹である」
    • 良いものであるからこそ広まっている
    • ただし近づきすぎるとデメリットもある
  • URL動詞は含めない
    • なるべく名詞に近づける努力
    • URLのかっこ良さに引かれるのは疑問
  • コピー先はコピー元と従属関係がないため階層構造は不当
  • URL設計のほとんどの時間は「名前を探す」ことに費やされる
  • 第三のリソースを探す
  • リソースの粒度/視点(つまりはURL)とデータベースの粒度/視点の違いを解釈してしかるべく結びつけるのがControllerの仕事
    • URLの言葉をDBの言葉に橋渡しする
  • HTTPメソッドの選択
    • URLが新たに作成される場合はPOST、URLがわかっている場合はPUT
    • どうにもならない場合はPOST
  • 接続性ある表現のために
    • サービスはクライアントURLを組み立てることを強制してはならないし、期待してはならない
    • クライアントが次に取りうる状態をすべてリンクまたはフォームの形で表現に含めるべき
    • クライアントURLを知り過ぎないようにする
  • RESTfulサーバとリッチJSという設計にしすぎるとUXが低下する可能性もある
  • 矛盾し合ういろんな制約のバランスを取ることこそが設計

1周めのリソース設計 (@moro)

  • routes.rbにいきなりmatchとか書き始めるとドツボにはまる。書くのはリソース設計があらかた決まってから
  • 例「イベント登録」
    • events <-> registrations <-> users
    • /events/42/add_users
      • イベントにユーザーを追加する? よりも
    • /events/42/registrations
      • イベントの参加登録情報を作る
  • ユーザーから見てわかりやすい形で流通させるのがリソース
  • 単純なCRUDはRailsAdminでできる
  • memberはそのリソースの一部だけを扱うときに使える
    • 「メンバ変数」のメンバ
    • /users/42/token

その他

  • パターン化したアクションはEngineに割り当てる
  • routes.rbにあまり更新が発生しないようにする
  • routes.rbの9割くらいはresource(s)でまかなっている
  • リソースの部分的な更新はあまりやらない設計にする
  • まずはベタなところで動くことを考える

感想

[twitter:@tkawa]さんのリソースモデリングはどれもしっくりくる命名で感心しました。[twitter:@t_wada]さんの発表は時間の割に情報が凝縮されまくっていて圧倒された上にとてもためになりました。メモれなかったところを復習したいのでスライド公開期待です。

勉強会後に自然と開発意欲の湧いてくる、素晴らしい内容だったと思います。ありがとうございました!

あわせて

2011-12-15

さいきんのRailsアプリで使ったgem 10個

最近は、運用中Railsアプリの管理画面をTwitter Bootstrapでリニューアルしたり、こまごまと機能追加なんかしたりしてました。そんな中で新たに使ったgemライブラリを簡単にまとめてみます。

Prawn

  • no title
    • PDF作成
    • 日本語フォントとあわせて日本語表示も可能
    • 表や図などある程度自由にレイアウトできる
    • prawn-railsというのもさっき見つけた

Haml-rails

erb2haml

  • no title
    • ERBのviewファイルを一括置換
    • Hamlの文法を覚える参考にもなる

Kaminari

  • no title
    • ページネーション
    • will_paginateよりもなんとなくこちら
    • will_paginateよりもプラガブルかつクリーンな作り(と思う)

SimpleForm

  • no title
    • フォーム生成補助
    • 記述は少なく済むけど凝ったレイアウトにはしづらい
    • 管理画面などとは相性良いはず

ShowFor

  • no title
    • 詳細画面生成補助
    • SimpleFormみたいな感じ

jpmobile

  • no title
    • ガラケー/スマートフォン対応
    • Rails3.0系にはjpmobile1系
    • 絵文字も1ソースで3キャリア対応できる

Airbrake

  • no title
    • エラー通知サービス(旧Hoptoad)
    • Egg Plan が無料で1プロジェクト導入可能
    • Capistrano対応
    • 予期しない部分のエラー検知に役立つ

pry-rails

  • no title
    • rails console で pry
    • 今のところカラー表示しかメリット享受してないけどirbよりはいいのかなと

rails_best_practices

  • no title
    • より良いRailsコードへのアドバイス的なツール
    • リファクタリングの指針として有用

Twitter Bootstrap/Haml/SimpleFormなどによる管理画面は、慣れてきたらかなり軽快に開発できた気がします。記述量が少ないおかげで、変更や機能追加にも対応しやすいのがいいと思います。

あと、Airbrakeはおすすめです。


4797363827
Rails3レシピブック 190の技

2011-06-23

lsyncd2系で複数サーバーにリアルタイム同期

同期元でファイルの変更を検知してリアルタイムミラーリングできます。2.0系から設定ファイルがXMLでなくLUAという言語のものになったようです。

環境

  • Basic 32-bit Amazon Linux AMI 2011.02.1 Beta
  • lsyncd 2.0.4

構成

同期先サーバ

rsyncdで待ち受け
  • rsyncd設定
sudo vim /etc/rsyncd.conf
[application]
path = /path/to/application
log file = /tmp/rsyncd.log
uid = apache
gid = apache
read only = no
  • rsyncd起動
sudo rsync --daemon
rsyncd自動起動
  • xinetdインストール
sudo yum install xinetd
  • xinetdのrsync設定
sudo vim /etc/xinetd.d/rsync
service rsync
{
        disable = no
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/bin/rsync
        server_args     = --daemon
        log_on_failure  += USERID
}
  • disableをnoにする
  • xinetdによる起動
sudo /etc/init.d/xinetd start
  • 自動起動ON
sudo chkconfig xinetd on

同期元サーバ

lsyncdインストール
#必要なパッケージ
sudo yum install make gcc pkgconfig lua-devel
#lsyncd DL&展開
wget http://lsyncd.googlecode.com/files/lsyncd-2.0.4.tar.gz
tar xzf lsyncd-2.0.4.tar.gz
#インストール
cd lsyncd-2.0.4
./configure
make && sudo make install
lsyncd設定
sudo vim /etc/lsyncd.conf
settings = {
   logfile    = "/tmp/lsyncd.log", --ログファイル
   statusFile = "/tmp/lsyncd.status", --同期ファイル状態
   nodaemon   = false, --デーモンモードON/OFF
}

sync {
    default.rsync, --同期コマンド種別
    source="/path/to/source", --同期元
    target="xxx.xxx.xxx.xxx::application", --同期先
    rsyncOps="-ltus" --rsync上書きオプション
}

--[[
sync {
    default.rsync,
    source="/path/to/source",
    target="xxx.xxx.xxx.xxx::application",
    rsyncOps="-ltus"
}
]]
  • settingsに設定記述
  • syncに同期の情報記述
  • defalut.rsyncの動作
/usr/bin/rsync -ltsd --delete --include-from=- --exclude=* SOURCE TARGET
  • AWSの場合は同期先にPrivate IPを記述
  • 複数サーバー対応するにはsyncの定義を複数記述
  • --[ [ から ] ] まではコメントアウト
lsyncd起動
#動作チェック
lsyncd -rsync /path/to/source xxx.xxx.xxx.xxx::destmodule
#通常起動
lsyncd /etc/lsyncd.conf

使ってみて

  • ファイル変更から同期開始までは数秒の遅延がある
  • Webサーバー追加時は設定追記してlsyncd再起動必要
  • Webサーバーのキャッシュクリアしたい場合
  • オートスケーリングとの共存は相当困難な気がする
    • オートスケーリング前提なら管理サーバーでrsyncd動かしてWeb側の初期スクリプトで取りにいくのが良さげ

関連リンク


4774145017
プロのための Linuxシステム構築・運用技術 (Software Design plus)

4774146005
サーバ/インフラエンジニア養成読本 [現場で役立つ知恵と知識が満載!] (Software Design plus)

関連記事

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

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'
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

プラグイン

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 アプリケーションプログラミング

関連記事