Ruby(Ruby on Rails)で、使わなくなったメソッドをdepricatedにする

ある程度コードを書いていると、使わなくなったメソッドや、新しいメソッドを作ったので使って欲しくないメソッドなどが多々出てくるかと思います。

コメントで書いておいても、使う人はいるし、既存コードで知らぬ間に使ってあったりもします。

そんな時は

depricatedをログに出力するようにしてしまいましょう。

そうすれば、その処理を通るたびにワーニングとしてdepricatedなメッセージが出力されるので

対処しやくすなります。

書き方としては、

[ruby]def old_method
warn "[DEPRECATION] ‘old_method’ is deprecated. Please use ‘new_method’ instead."
end[/ruby]

という感じに

RailsからMySQLのテーブルを作成する時にLONGBLOBなカラムを作成する方法

RailsからMySQLのテーブルを作成するには

Railsのマイグレート機能には、カラム属性としてbinaryがあるのですが、これを指定してもMySQL上ではBLOBというカラム属性になります。

構文としては
[ruby]create_table :user_photos do |t|
  t.string :name
  t.binary :photo_image
end[/ruby]
もっと大容量のLONGBLOBが欲しい!

という時にはbinaryの所にオプションで:limit => 16.megabyte を指定します。
[ruby]create_table :user_photos do |t|
  t.string :name
  t.binary :photo_image, :limit => 16.megabyte
end[/ruby]
こんな感じですね。

ActiveRecordのscopeで作成した条件などをSQLとして出力する

[ruby]scope :active, where(‘deleted_at is null’)[/ruby]
というスコープを設定したとして

この条件を含むSQLをコード内で取得したい場合ってありますよね。

SQL書いてでゴニョゴニョしたい場合とか…。

そんな時には
[ruby]Article.active.to_sql[/ruby]
としてやれば、
[sql]select * from articles where deleted_at is null[/sql]
というSQLが取得出来ます。

参考例
[ruby]# === タグ
class Tag < ActiveRecord::Base
scope :have_article, lambda{|sql| where("tags.id in (#{sql})")}
end

# === 記事
class Article < ActiveRecord::Base
scope :active, where(‘deleted_at is null’)
end

# === ルートコントローラー
class TopController < ApplicationController
def index
# ここで、
# select tag_id from articles group by tag_id
# というSQLが取得出来る
 articles_sql = Article.active.group(‘tag_id’).select(‘tag_id’).to_sql

# ここで、
# select * from tags where tags id in (
# select tag_id from articles group by tag_id
# )
# というSQLが内部で生成される
  @tags_have_articles = Tag.have_article(articles_sql)
end
end[/ruby]

DBとは関係ないフォームの項目をバリデートする

[ruby]
class ActiveForm
include ActiveModel::Conversion
extend ActiveModel::Naming
include ActiveModel::Validations

def persisted?; false; end

def initialize(attributes = {})
attributes.each do |name, value|
send("#{name}=", value) rescue nil
end
end
end
</pre>

こんな感じのクラスを一つ準備して、あとはこれを継承して

[ruby]
class SearchForm < ActiveForm
attr_accessor :age
validates :points, :numericality => true
end
[/ruby]

という感じにする。

Rails 3 用のacts_as_paranoid

Rails 2.x系で、論理削除と言ったら、もうこれ!というのが

acts_as_paranoid

でした。

Rails 3.x系では

rails3_acts_as_paranoid
https://github.com/goncalossilva/rails3_acts_as_paranoid

を使います。

インストールの方法は

GemFileに
[shell]gem “rails3_acts_as_paranoid”, “~>0.2.0″[/shell]
と追記して
bundle実行
※Rails3.1の場合は、GemFileに書くプラグインのバージョンが”~>0.1.4″になります。
※Rails3.0の場合は、GemFileに書くプラグインのバージョンが”~>0.0.9″になります。

あとは、論理削除対象のテーブルにdeleted_atカラムを追加し、モデルに
[ruby]class Users < ActiveRecord::Base
acts_as_paranoid
end[/ruby]
という感じで宣言してやればOK。

Rails 3.2.8をUbuntuに一からインストールしてみる

UbuntuにRails3.2.8の実行環境を一からインストールしてみます。

Ubuntuは12.04を使用します。

まずは

Rubyから、と言いたい所ですが、必要パッケージ類から
[shell]sudo apt-get install make build-essential libssl-dev zlib1g-dev \
apache2-mpm-prefork apache2-prefork-dev libapr1-dev libaprutil1-dev \
libcurl4-openssl-dev libmysqlclient-dev[/shell]
MySQLをインストール
[shell]sudo apt-get install mysql-server mysql-client[/shell]
続いて、RubyはUbuntuのパッケージで1.9.3と言うのがあるので、これを入れます。
[shell]sudo apt-get install ruby1.9.3[/shell]
Railsを入れます。
[shell]sudo gem install rails -v3.2.8 –no-ri –no-rdoc[/shell]
riとrdocはいらないので、無しオプション付きで。

MySQLとのコネクタgemをインストール
[shell]sudo gem install mysql[/shell]
Passengerをインストール
[shell]sudo gem install passenger[/shell]
Passengerのコンパイル
[shell]sudo passenger-install-apache2-module[/shell]
Passengerの設定ファイルを作成

passenger-install-apache2-moduleの実行後にpassenger_moduleに関する設定が3行表示されるので、それを

/etc/apache2/conf.d/passenger.conf

に設定

ここからRailsの操作になります。

新しいプロジェクトを作成
データベースはMySQLを使うので、オプション指定
[shell]rails new myproj -d mysql[/shell]
ひとまず、rake -Tをしてみます。
[shell]rake -T[/shell]
rake -T とやると、エラーになります。

Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)

これは、JavaScriptのランタイムが設定されていないと言っているので、GemFileに
[shell]gem ‘execjs’
gem ‘therubyracer'[/shell]
という2行を追加して

bundle 実行します。

これで、rake -Tの結果が表示されるようになったと思います。

続いて、MySQL上にデータベースを作成します。
[shell]mysql -uroot -p[/shell]
でMySQLにログイン後、テーブル作成
[shell]create database muproj_development;
exit[/shell]
続いて、実験用にusersテーブルを作ります。
[shell]rails g scaffold users name:string age:integer[/shell]
これで、users用のコントローラやモデルなどが一式作成されます。

データベースにテーブルを作成します。
[shell]rake db:migrate[/shell]
これで、myprojの準備は整いました。
[shell]rails s[/shell]
でmyprojを起動してみましょう。

正常に起動出来たら、ブラウザからアクセス

http://localhost:3000/users

 

Rails 3 の環境でstylesheetにlessを使う

Rails 3.2では、javascriptやstylesheetはassetにまとめられます。

ここにまとめられたものは
例えばstylesheetであれば自動的に「コントローラ名.css.scss」がcssコンパイルされ、
リンクされます。自分で指定する場合は
[shell]<%= stylesheet_link_tag “users” %>[/shell]
とすればリンク出来ます。

さて、Rails3.2では、stylesheetはscssが、JavaScriptはCoffeScriptがそれぞれ

標準で使用されるようです。

例えば、stylesheetでlessを使いたい

といった場合には

GemFileのassetグループの中に
[shell]group :assets do
  gem ‘less-rails’,   ‘~> 2.2.3’
end[/shell]
という感じでgemをしていしてやると、自動で*.lessファイルを展開してくれるようになります。

[Ruby on Rails 3]SolrをRuby on Rails 3から使う

Ruby on RailsからSolrを使うには、このプラグインを使うと良さそうだ

sunspot_rails

ホームページは

https://github.com/outoftime/sunspot

sunspotプロジェクトの一部になっています。

インストールは

Ruby on Rails 3の場合

gemfileに
[shell]gem ‘sunspot_rails’
gem ‘sunspot_solr’ # optional pre-packaged Solr distribution for use in development[/shell]
を追加

あとは
[shell]bundle install[/shell]
を実行

Ruby on Rails 2の場合は

#config/environment.rb

[shell]config.gem ‘sunspot’
config.gem ‘sunspot_rails'[/shell]
を追加

#config/development.rb
#config/test.rb

[shell]config.gem ‘sunspot_solr'[/shell]
を追加
[shell]rake gems:install[/shell]
を実行

config/sunspot.ymlを作成
[shell]rails generate sunspot_rails:install[/shell]
a

[Ruby on Rails]バッチ処理のrbをテストする方法

バッチ処理として書いたrbファイルをテストする場合

テストケース内で

[ruby]system("ruby バッチファイル")[/ruby]

としても良いが

たとえばTimecopで日付を固定してテストする場合には具合が良くない。

バッチのプロセスが別プロセスで動くため、Timecopの設定がバッチに反映されない。

なので

systemで呼び出している部分を

[ruby]load "バッチファイル"[/ruby]

というように、loadに変えると、そのバッチ処理が都度ロードされるので

テストを実行しているプロセス内でバッチファイルが実行される形になる。

Railsで日付処理

Railsで日付処理は、意外と簡単に出来たりする。

1日前

1日後

1ヶ月前

1ヶ月後

1年前

1年後

また、本日の開始日時として、たとえば

2011-10-01 00:00:00

という情報を取りたい場合

逆に

2011-10-01 23:59:59

という情報を取りたい場合

月初を得る

月末を得る

Rails 2.*系で「rake/rdoctask is deprecated. Use rdoc/task instead (in RDoc 2.4.2+)」エラー

Rails 2.*系のプロジェクトで、rakeコマンドをたたくと、

というエラーが発生することがある。

このエラーは rake のバージョンが新しすぎるのが原因。

基本的にRails3.0.5より前のRailsでは、rakeのバージョンは0.8.7を使う。

新しいrakeが入っている場合

と実行すればよい

Rails 3.0.5 で「uninitialized constant Rake::DSL」

Rails 3.0.5でプロジェクトを作成し、rake db:migrateなどを実行するときに

というエラーが出る。

これは、Rails 3.0.5以前ではrakeのバージョンが0.8.7以下でなければRake::DSLが無いというエラーになるという物。

なので、Gemfileの中で

というようにrakeのバージョンを指定することで解決できる。

その後、プロジェクトでロックされたgemの一覧を更新するために

を実行する必要がある。

Aptana Studio 3 でのAptanaのテーマ設定

Aptana Studio 3 にしたところ、Ruby on Railsの表示にテーマが適用されるようになった。

これはこれで、背景が黒でかっこいいのだが、SVNのベースリビジョンとの比較をかけたりすると、すべて真っ黒で良く見えない。

簡単に行くなら、テーマを変えるのがいいが、せっかくなので、Aptana Studio 3 のテーマのままでなんとかしたい。

ま、背景黒というのは諦めて、白くする

白くすると、キーワードなどが色が薄すぎて見えない

ので、色を濃くする。

そんな感じのことを地道にやって、完了した。

再構築する際に、いじった設定が消えるのが嫌なので、ここに載せる。

#bundle.rb

使い方は、bundle.rb というファイルを新規作成し、中身に上記を貼りつけて保存

その後、Aptanaを開き、[preferences]のAptanaのThemeを開き、Importする。

Aptana Studio 3 で、Shift Right, Shift Leftのショートカットキー

最近、Aptana Studio が3.0になっていたので、早速インストール。

が、今まで使っていたShift Right(Ctrl + Alt + 右矢印)、Shift Left(Ctrl + Alt + 左矢印)のショートカットが使えなくなっていた。

仕方が無いので、ショートカットキーの設定を変える。

PreferencesのGlobalのkeys画面で

shift rightを検索

Whenという項目で、「Aptana Editor」を選択

Bindingという項目をクリックし、「Ctrl + Alt + 右矢印」を直接キー入力

Applyボタンクリック。

shift leftを検索

Whenという項目で、「Aptana Editor」を選択

Bindingという項目をクリックし、「Ctrl + Alt + 左矢印」を直接キー入力

Applyボタンクリック。

これで、Rubyソースや、erbソースを編集中にShift Right、Shift Leftが出来るようになる。

Passengerで動かすRailsプロジェクトで、rMagickを使う時の設定

ImageMagickのをソースからインストール
※/usr/localに入るので、rootで実行

/usr/local/libをライブラリ登録

/etc/ld.so.conf.dに
ImageMagick.confファイルを作成
ファイルの中に

/usr/local/lib

を記入
ldconfigを実行

rmagickのインストール

rescue_from でコントローラごとに例外時のアクションを指定

コントローラで rescue_from を指定することで、そのコントローラで例外が発生したときなどに実行する処理を指定することが出来る。

Rails3 で、日本語化

Rails3の日本語化をする

#config/application.rbファイルの編集

このファイルに日本語で動くことを指定する設定を追加する

#config/localesディレクトリにjp.ymlファイルを設置
jp.ymlファイルの中身は

Rails3で、productionで起動したときにpublic内のファイルがnot foundになる件

rails3のプロジェクトを作成し、起動時に

という感じでプロダクションモードで起動したときに、なぜかpublic配下のファイルがすべてNot Foundになってしまう。

これは、config/environments/production.rb ファイルの中の

config.serve_static_assetsという設定があるのだが、これをtrueに設定してやることで、表示できるようになる。

ちなみに、サーバに配置してpassengerなどでproductionモードで実行した場合は

config.serve_static_assetsの設定はfalseのままで問題ない。

rails s -e productionで実行した場合にこの現象が出るようだ。