ホーム ブログ ページ 68

Ruby on Railsで作られたredmineのカスタマイズ1 ~インストール編~

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちはtacchiです。
redmineについて数回に分けて語ってみます。

Tracでのプロジェクト管理

自分のプロジェクトでは、Tracを利用して各々のタスクを管理しています。全員のタスクを把握すること、各自が各々のタスクを宣言することによって把握することを目的としています。
こういった使い方をされてるところは、少ないと思いますが、これがなかなか使えるんです。  

今までTracを利用していたのですが、redmineの記事を見つけたので、試してみました。

redmineを試した理由

なんで今頃redmineなのかと言われるかもしれないのですが、Tracとredmineの違いとして、Tracは多くのプラグインが用意されていて、redmineはそれがないと言われてるのですが、自分たちにとってはredmineの方がカスタマイズしやすいのではと思ったからなんです。それは、Ruby on Railsを採用しているからなんです。  

今回は、redmineのインストール方法を記します。いつまで続くか分からないですが、必要な機能を付けたしていければと思っていて、ここで公開させてもらえればと思ってます。

検証環境

CentOS 5
ruby 1.8.6
Rails 1.2.6
mysql Ver 14.12 Distrib 5.0.22

redmineのインストール方法

1.svnでソースをチェックアウト
$ svn checkout svn://rubyforge.org/var/svn/redmine/trunk redmine
$ cd redmine

2.DB接続のための設定を行う$ vi config/database.yml

※database.ymlの中身production:
adapter: mysql
database: redmine
username: redmine
password: redmine
encoding: utf8

3.DB作成
mysql > create database redmine;

4.テーブルの作成(redmine以下で実施)rake db:migrate RAILS_ENV=”production”

5.初期データのインポートrake load_default_data RAILS_ENV=”production”

6.起動ruby script/server -e production  

大体、上記で動くと思います。自分は、mongrel_clusterの設定を行って、Apacheを利用して閲覧できるようにしています。

利用した感想

使いこなせると、とても便利だと思います。最初言ったようにRuby on Railsだとカスタマイズしやすいので、色々できるんではないかと期待しています。時間の許す限りTryしてみたいと思います。とはいえ、業務優先。  

MacBook AirのレビューとLet’s noteとの比較

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

うちの会社にもMacBook Airが届きました。

私の物ではないですが、とりあえずフォトレビュー用に写真をとりました。

とりあえずid:kstnが使うみたいです。

という訳で写真と、let’s noteとの比較は…..

まず、左側面のportです。

usb一つにディスプレイケーブル用1つにヘッドホン端子です。

少ない。

しかも折りたたみ式です。

格納できます。

次に右側面の電源ケーブルの接続先と電源ケーブル。

 しっかりくっついているというわけではなく、

持ち上げるとすぐ外れました。

恐らく、充電途中でもケーブルの抜き差しを意識せずに持って立ち上がれる事を

意識しているのかと。

パームレストの尖っている部分がちょっと痛そうです。 

そして、薄さや大きさを手持ちのLet’s note(w5)と比較してみました。

実際に比較した写真。

真横からじゃなくてすいません。。。。

倍以上の差を感じます。

やはり厚さは全然違いますね。

上から見た形。

Airの方が大きいです。

重量は、手に持った感じで何人かに聞いてみた所

「わからない」や「Let’s noteの方が軽い」とか「air のが軽い」とか

バラバラでした。実際は大してかわらないと思います。 

画面が大きくて 薄くて、重さは一緒という事で、

モバイルPCとしての利便性は十分に果たせるんじゃないでしょうか。

ただ、こうやって間隔が開いてるキーボードは結構苦手です。

ここで自分なりのMacbookのメリットデメリット(Let’s noteと比較して)

メリット 

1.MacOSが使える。

2.CTRLがデフォルトでAの横(Let’s noteだと設定変更が必要)

3.薄いので鞄に入れても、他の本が入れれる。

4.軽いので持ち運んでもあまり疲れない。

デメリット 

1.パームレストが尖ってる。

2.結構サイズが大きいので入る鞄が限られてくる

3.薄さの割には重い。

4.ドライブが無い。

5.USBポートが少ない。 

6.バッテリーが持たない。(予測)

こんな所でしょうか。

半額ぐらいだったらサブノートとして気軽に買えるんだけどなーと

個人的に思ってます。 

Railsの開発でscreenを使う理由

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

どうも、高瀬です。

書く回数が多い気がしますが、本当の順番は、月曜日である今日で、

今日書くのは業務なので一応書きます

以前、自分のブログでscreenのはじめ方 や screen ショートカットキー一覧というエントリを書いたことがありますが、

今回は、何故Railsの開発にscreenを使っているのかという話を書いてみます。

以前、該当のエントリでは、下記の様に書きました。

1.複数シェルを立ち上げてSSHでも画面切り替えが出来る。
2.ssh等の接続が切れても再度つなぎなおす事が出来る。
3.コピペSSH越しでもキーボードのみで可能。

使い始めた当初は実際それがきっかけだったんですが、

使い込んでくるとRails開発との親和性が高いことがわかってきます。

今じゃローカルでもscreen使ってますからね。

というわけでローカルでもscreenを使い続ける理由

1.プログラムが並行で動かせる
2.コンソール以外は見なくても済む。
3.alt + tabで切り替える画面数が少なくて済む。
4.作業を中断した所から再開できる。
5.screenのログをとる事で作業履歴が追える。

で、特に1.のプログラムが並行で動かせる事が一番の理由だったりします。

実際にrailsの開発時に立ち上げる物としては以下の様な感じになります。

1. vim(もしくはemacs)でプログラム弄る。
2. ruby scrip/console でプログラム試し
3. autotest(もしくはrake実行) でテスト
4. mysqlやpgsql等DBプログラム でデータ確認
5. topコマンド で負荷確認
6. tail -f でログファイル監視
7. svn とか ls とか findとか通常のシェルで
8. ruby script/server(大体の場合これはデーモンとして動かしてます)

計8個です。

これだけWindows等でプログラムを立ち上げたら

切り替え時にALT + TABするだけでも大変です。

しかもコンソール以外にもブラウザやメーラーやメッセンジャ、IRCクライアントなどあれば混乱の極み(アッー)です。

というわけでscreenのウィンドウ毎に名前をつけて

番号指定して切り替われば作業が効率化するわけです。

(実は本気出せば意外とvimでも実行できたり

IDE系のツールでもできたりしますが。。。)

 consoleでちょこっとPG弄くってpgに反映したり、

 autotestでエラー出てないか確認したり

 dbを見ようとしてmysqlに切り替えたり

 svn のチェックしたりとかが全てキーボードで操作できるのです。

全てキーボード、全てコンソール。

凄く幸せです。

ホームポジションから手が動きません。

マウス要りません。

楽です。

文字だけで、グラフィックのない画面を見てると集中できますし、

シェル主体の開発になることで自然とサーバの操作を覚えられる利点もあります。

その気になればウィンドウ分割もできますし、

というわけであなたも今日からscreen使いましょう。

[screenのはじめ方]

補足:あとはブラウザとしてw3mとかlynxの操作方法を覚えるぐらいでしょうか(※まだ慣れていない)

ActiveRecordのconditionsを綺麗に書くTips2つ

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

高瀬です。Railsで開発してる 人は一部の例外(RubyでActiveRecordを使わないでDBに接続する方法)を除いてactiverecord(AR)でDBを検索すると思います。 今回はARでDBの検索をする際に綺麗に書けるようになるtipsです。

1.conditions句をシンボル使ってDRYに書く

conditions句って実はシンボル使えるらしいのです。

最近まで知りませんでした。

というわけで、?だと

:conditions =>[“(prefecture_id = ? and user_id = ?)  or (other_prefecture_id = ? and other_user_id = ?)”,  11, 2, 11, 2]

 と、分けわかんなくなっちゃう様な検索文を

:conditions =>[“(prefecture_id = :prefecture_id and user_id = :user_id)  or (other_prefecture_id = :prefecture_id and other_user_id = :user_id)”, {:prefecture_id => 11, :user_id => 2}]

っていう書き方ができます。

2.ヘルパつかってみる。 

こんなライブラリとかをつかいます。

module ActiveRecordHelper
def flatten_conditions(conditions, op = “and”)
return nil if conditions.empty?
ps = []
condition = conditions.collect do |c|
next if c.size < 1
ps += c[1..(c.size)]
“( #{c[0]} )”
end.delete_if { |c| c.blank? }.join(” #{op} “)
[condition, ps].flatten unless condition.empty? end
end

class ActiveRecord::Base
include ActiveRecordHelper
end

そーすると

@condition = []

@condition << [” prefecture_id = ? “, params[:prefecture] ] if params[:prefecture]

@condition << [” sex = ? “, params[:sex] ] if params[:sex]

  @users = User.find(:all, :conditions => @conidition)

こういう風に、配列にガシガシ追加するだけーという検索条件の追加の仕方ができます。

RailsのActionMailer(Tmail)でドットの連続などのRFC違反している携帯メールアドレスに対応する

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちは、KBMJの中平@railsエンジニアです。
今回は、docomoやauなどのメールドレスでドットの連続とか@の前にドットをつけたRFC違反メールアドレスだと、ruby on rails のActionMailer(Tmail)でメール送受信が失敗していたので、その対策方法を書きます。RFC違反メールアドレスだとActionMailer(Tmail)でどのような問題が起こるのか

ruby…rails.@kbmj.com などのメールアドレスだとActionMailer(Tmail)を使ってメールの送受信をした時に、メールアドレスの
from、toがnilになってしまいメールアドレスが送受信できません。
(スパムが心配なのでドメインは弊社のものにしています。)

確認してみる

ruby script/console
>> TMail::Version
=> “0.10.7”
>> mail = TMail::Mail.new
=> #<TMail::Mail port=#<TMail::StringPort:id=0x27c5f68> bodyport=nil>
>> mail.from = ‘ruby…rails.@kbmj.com’
=> nil

とnilになってしまい、メールアドレスがきちんと取得できません。

■対策方法
こちらのサイトを参考にさせていただきました。

最新のTMailだと対策されているみたいですが、リリース済みのプロジェクトでしたので、parse.yからparse.rbを作り直します。

1.parse.yファイルを取得します。

Tmailを単体で取得し、その中にparse.yがありますのでそれを使います。
http://rubyforge.org/frs/?group_id=4512
ここからダウンロード、使用しているTMailと同じバージョンのものを使います。

リビジョン 3329で対応しているみたいですので、
変更内容
svn log -r 3329 http://i.loveruby.net/svn/public/tmail/trunk/

svn diff -r 3328:3329 http://i.loveruby.net/svn/public/tmail/trunk/lib/tmail/parser.y
で変更点を同じようにダウンロードしたpaser.yに編集します。

2.parse.yからparse.rbを作成しなおします。

raccを使いparse.yからparse.rbを作成いたします。
raccがない場合は取得して使ってください。

windows環境だとサンプルのように
racc -ocalc.rb calc-ja.y
としても、実行されないので
c:\ruby\bin\racc  -ocalc.rb calc-ja.yという感じで実行する必要があります。

praser.rbを作成する。

c:\ruby\bin\racc  parser.y -E -o tmail_parser.rb

参考にさせていただいたサイトですと、直接既存のparser.rbを置き換えていますが、
私は直接置き換えずtmail_parser.rbとファイル名をつけ、
project\libの中にtmail_parser.rbを入れておき
起動時に
TMail.instance_eval{remove_const ‘Parser’}
require ‘tmail_parser’
として、parser.rbを新しいtmail_parserを使うようにしております。

これで、RFC違反メールアドレス対策が出来ました。
確認してみる。

ruby script/console
>> mail = TMail::Mail.new
=> #<TMail::Mail port=#<TMail::StringPort:id=0x27c5f68> bodyport=nil>
>> mail.from = ‘ruby…rails.@kbmj.com’
=> “ruby…rails.@kbmj.com”


問題ないことが確認できました。

第2の問題
実際にメール送受信を試したところ、送信は出来ているのですが受信に失敗していました。
ログを調べてみると・・・・
postfixがRFC違反メールアドレスだと、

ruby…rails.@kbmj.comを”ruby…rails.”@kbmj.com という感じで変更していました。


そのため、再びparseが上手くいかずメールアドレスがnilになっていました。
ログを見るとヘッダー情報にはメールアドレスがそのままきていましたので、

require ‘action_mailer’

module TMail
  class Mail
    # 指定された名前の最初のヘッダを取得する
    def first_header(key)
      if port.to_s =~ /^#{key}:\s*(.*)/i
        $1
      else
        nil
      end
    end
  end
 end

このようなmoduleを作成し、
メールの受信処理に

def receive(email)
email.first_header(‘return-path’).sub(/^</, ”).sub(/>$/, ”).sub(/^\”/,”).sub(/\”@/,’@’)
end

とすることで、無事メールアドレスが取得できました。

古いバージョンActionMailer(Tmail)でRFC違反メールアドレスの対応する場合は参考にしていただければと思います。

[Rails 2.0]起動時のファイルの読み込みの順番がわかった!

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

 こんにちは。

 KBMJでRuby on Rails を使ったweb開発に携わっているyoppiといいます。

 今回は、Rails 2.0のプロセス起動時に読み込まれるファイルの順序について調べてみました。

 まず、気になったのはRiding Rails: Rails 2.0: Preview Releaseにある。config/initializers配下のファイルの読み込みがどの段階なのかということです。

 Rails::Initializerのソースを見てみると、proccessの一番最後で行われていたので、プロセス起動時の最後の段階で読み込まれるようです。(ちなみに複数ある場合は、ファイル名順)

 config/environment.rbで初期化した変数とか使えるのかな~というのが一番の懸念点でしたが、大丈夫なようです。

 この調査で、わかったのですが、プロセス起動時前の処理とかも別ファイルで指定できるようになっているみたいです。

 config/preinitializer.rbを用意すると、プロセス起動時の一番最初にこれが読み込まれます。あんまり使うことはなさそうですが、頭の片隅に入れておくと今後役に立つかもしれません。

 config/initializers配下については使っていきたいと思っていたので、読み込まれる段階がわかってよかったです。config/preinitializer.rbについても必要になったら使っていきたいと思います。

【まとめ】起動時のファイルの読み込みの順番

config/preinitializer.rb

config/environment.rb

config/initializers配下のファイル

Ruby on Railsでacts_as_paranoidを使い倒す

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

KBMJのプログラマのx5rです。

今日はRuby on Railsプラグインのacts_as_paranoidについて説明します。
これはDBのモデルデータを削除をする時に物理削除ではなく、論理削除をするためのプラグインです。

Railsの2.0系がリリースされましたが、まだ1.2系で開発することも多いと思います。
しかし、このacts_as_paranoidプラグイン、使い方は簡単ですが、Railsの1.2.5で利用する時に一部の機能でエラーが発生して使用できなかったり、また、私の希望する機能がありませんでしたので、このacts_as_paranoidプラグインを一部改良しました。

そこで、私が行ったエラーの対処法と拡張を説明したいと思います。
なお、以下#{RAILS_ROOT}で全て作業しているものとします。

CRUDアプリの作成

前回のAmazonAPIの使い方を説明した時は、Railsのバージョンは2.0系でしたが、今回はRails1.8.5を利用します。

まず、CRUD処理が必要なので、scaffoldを利用して作成します。
以下、単純なので簡単に流れだけ書いておきます。

 $ script/generate model Book #Bookモデルの作成
 $ less db/migrate/001_create_books.rb #Bookモデルのマイグレーションを編集
 class CreateBooks < ActiveRecord::Migration
   def self.up
     create_table :books do |t|
       t.column :title,        :string
       t.column :author,       :string
       t.column :date,         :date
       t.column :created_at,   :datetime
       t.column :updated_at,   :datetime
     end
   end
    def self.down
     drop_table :books
   end
 end
 $ rake db:migrate #マイグレート
 $ script/generate scaffold Book Book #scaffoldを作成
 $ script/server #サーバ起動 

では、http://localhost:3000/bookにアクセスします。
実際にデータを追加して削除すると、レコードが削除、つまり物理削除されていることがわかります。

acts_as_paranoidの導入

acts_as_paranoidのインストール

acts_as_paranoidプラグインをインストールします。

 $ ruby script/plugin source http://techno-weenie.net/svn/projects/plugins
 $ ruby script/plugin install acts_as_paranoid 

 deleted_atカラムを追加

acts_as_paranoidプラグインではdeleted_atカラムを論理削除のためのフラグとして機能しますので、deleted_atカラムを追加します。

 $ script/generate migration AddBooksDeletedAt #マイグレーションファイルの作成
 $ less db/migrate/002_add_books_deleted_at.rb #マイグレーションファイルの編集
 class AddBooksDeletedAt < ActiveRecord::Migration
   def self.up
     add_column :book, :deleted_at,   :datetime,  :comment => "削除日時"
   end
    def self.down
     remove_column :book, :deleted_at
   end
 end
 $ rake db:migrate #マイグレーション 

acts_at_paranoidの設定

Bookモデルにacts_as_paranoidクラスメソッドを追加します。

 $ less app/models/book.rb
 class Book < ActiveRecord::Base
   acts_as_paranoid
 end 

動作確認

実際に削除してみると、

 undefined method `construct_count_options_from_args' for Book:Class 

というエラーが表示されます。

これは最新のacts_as_paranoidプラグインがRails2.0に向けた対応をしたことによる影響らしいです。

そこで
RAILS_ROOT/vendor/plugins/acts_as_paranoid/lib/caboose/acts/paranoid.rb
の約90行目あたりの

 calculate_with_deleted(:count, *construct_count_options_from_args(*args)) 

 calculate_with_deleted(:count, *construct_count_options_from_legacy_args(*args)) 

に変更します。

これで削除をしてみるとうまく動作することが確認できます。

論理削除されたものも取得する

さて、場合によっては論理削除されたデータも含めた形で表示したいということもあるかと思います。
そして、acts_as_pluginは削除フラグのたっているものも含めて取得するためのメソッドも用意しています。

それが以下の2つの方法です。

  • :with_deletedオプションを指定
  • find_with_deletedメソッドを利用

はじめにBookControllerに次のようなアクションを追加し、簡単なテンプレートも作成して試してみます。

BookControllerにlist_with_deletedアクションを追加

$ less app/controllers/book_controller.rb
 class BookController < ApplicationController
    # --- 省略 ---
   def list_with_deleted
     #データ取得処理を記述する
   end
  end 

テンプレートを作成

 $ less app/views/book/list_with_deleted.rhtml
 <%- @books.each do |book| -%>
 
   <%= book.title %> - <%= book.author %> - <%= book.date %>
 <%- end -%> 

 :with_deletedオプションを指定

list_with_deletedアクションにデータ取得処理を記述します。

 $ less app/controllers/book_controller.rb
  class BookController < ApplicationController
    # --- 省略 ---
   def list_with_deleted
     @books = Book.find(:all, :with_deleted => true)
   end
 end 

http://localhost:3000/book/list_with_deletedにアクセスしてみます。すると

 Unknown key(s): with_deleted 

と表示されてしまいます。

そこで[#8896] find(:all, :with_deleted => true) broken (at least in version 0.3.1/July-2006)を参考にRAILS_ROOT/vendor/plugins/acts_as_paranoid/lib/caboose/acts/paranoid.rbの約58行目あたりの

 class << self
   alias_method :find_every_with_deleted,    :find_every
   alias_method :calculate_with_deleted,     :calculate
   alias_method :delete_all!,                :delete_all
 end 

に1行追加して

 class << self
   VALID_FIND_OPTIONS << :with_deleted unless VALID_FIND_OPTIONS.include?(:with_deleted)
   alias_method :find_every_with_deleted,    :find_every
   alias_method :calculate_with_deleted,     :calculate
   alias_method :delete_all!,                :delete_all
 end 

のようにします。
これで論理削除されたものも含まれて表示されます。

find_with_deletedメソッドを利用

find_with_deletedメソッドで論理削除されたものも取得する方法があります。

以下で説明するページネートで利用するためにこちらも確認してみます。
list_with_deletedアクションにデータ取得処理を記述します。

$ less app/controllers/book_controller.rb
 class BookController < ApplicationController
    # --- 省略 ---
   def list_with_deleted
     @books = Book.find_with_deleted(:all)
   end
 end 

http://localhost:3000/book/list_with_deletedにアクセスしてみます。すると

undefined method `extract_options!' for [:all]:Array 

というエラーが表示されます。
これもRails2.0に向けた対応によるものです。

そこで論理削除プラグイン(バグ修正) – Rails開発日記のサイトを参考に対応します。
上記のサイトではActiveSupportに直接変更を加える方法が説明されていますが、それはあまりやりたくないので、RubyおよびRailsの特性を生かして、クラス(モジュール)を拡張して対応してみます。
上記サイトのリンク先

のソースを今回のRailsアプリに反映させます。


RAILS_ROOT/libにactive_support_extend.rbというファイルを作成して以下のように記述します。

 $ less lib/active_support_extend.rb
  module ActiveSupport #:nodoc:
   module CoreExtensions #:nodoc:
     module Array #:nodoc:
       module ExtractOptions
         # Extract options from a set of arguments. Removes and returns the last element in the array if it's a hash, otherwise returns a blank hash.
         #
         #   def options(*args)
         #     args.extract_options!
         #   end
         #
         #   options(1, 2)           # => {}
         #   options(1, 2, :a => :b) # => {:a=>:b}
         def extract_options!
           last.is_a?(::Hash) ? pop : {}
         end
       end
     end
   end
 end
  class Array
   include ActiveSupport::CoreExtensions::Array::ExtractOptions
 end 

そしてRAILS_ROOT/config/environment.rbに

 $ less config/environment.rb # 一番下に記述
 require "active_support_extend" 

を記述してWebrickを再起動します。
そして、再度http://localhost:3000/book/list_with_deletedにアクセスしてみます。
これで論理削除されたレコードも表示されているのがわかります。

ページネートでfind_with_deletedを利用する

 ActionController::Paginationを拡張

上記で、論理削除されたデータの取得ができるようになりましたが、一覧画面でページネートを利用した際にも論理削除されたデータを取得したいことがあります。

そこでActionCcontrollerのpagination.rbを参考にページネートを拡張してみます。


RAILS_ROOT/vendor/plugins/acts_as_paranoid/lib/の下にpagination_extend.rbというファイルを作成し、以下のように記述します。

$ less vendor/plugins/acts_as_paranoid/lib/pagination_extend.rb
 module ActionController
   module Pagination
     def paginate_with_deleted(collection_id, options={})
       Pagination.validate_options!(collection_id, options, true)
       paginator_and_collection_for_with_deleted(collection_id, options)
     end
     module ClassMethods
       def paginate_with_deleted(collection_id, options={})
         Pagination.validate_options!(collection_id, options, false)
         module_eval do
           before_filter :create_paginators_and_retrieve_collections_with_deleted
           OPTIONS[self] ||= Hash.new
           OPTIONS[self][collection_id] = options
         end
       end
     end
     protected
     def create_paginators_and_retrieve_collections_with_deleted #:nodoc:
       Pagination::OPTIONS[self.class].each do |collection_id, options|
         next unless options[:actions].include? action_name if
           options[:actions]
          paginator, collection =
           paginator_and_collection_for_with_deleted(collection_id, options)
          paginator_name = "@#{options[:singular_name]}_pages"
         self.instance_variable_set(paginator_name, paginator)
          collection_name = "@#{collection_id.to_s}"
         self.instance_variable_set(collection_name, collection)
       end
     end
     def find_collection_for_pagination_with_deleted(model, options, paginator)
       model.find_with_deleted(:all, :conditions => options[:conditions],
                  :order => options[:order_by] || options[:order],
                  :joins => options[:join] || options[:joins], :include => options[:include],
                  :select => options[:select], :limit => options[:per_page],
                  :offset => paginator.current.offset)
     end
     def count_collection_for_pagination_with_deleted(model, options)
       model.count_with_deleted(:conditions => options[:conditions],
                   :joins => options[:join] || options[:joins],
                   :include => options[:include],
                   :select => options[:count])
     end
     def paginator_and_collection_for_with_deleted(collection_id, options) #:nodoc:
       klass = options[:class_name].constantize
       page  = params[options[:parameter]]
       count = count_collection_for_pagination_with_deleted(klass, options)
       paginator = Paginator.new(self, count, options[:per_page], page)
       collection = find_collection_for_pagination_with_deleted(klass, options, paginator)
        return paginator, collection
     end
   end
 end 

やっていることは最終的にfind_with_deletedメソッドを実行するために、そこまでのルートで呼ばれるメソッド名に「_with_deleted」を付けているだけです。
DRYではないですが、まあよしとします。

そして、RAILS_ROOT/vendor/plugins/acts_as_paranoid/init.rbでロードします。

$ less vendor/plugins/acts_as_paranoid/init.rb
 # 先頭に追加
 require 'pagination_extend'
 # 以下省略 

BookControllerのlistアクションを修正

 $ less app/controllers/book_controller.rb
 class BookController < ApplicationController
   # --- 省略 ---
   def list
     @book_pages, @books = paginate_with_deleted :books, :per_page => 10
   end
   # --- 省略 ---
 end 

動作確認

http://localhost:3000/book/listにアクセスすると、論理削除されたデータも含めたページネートが実現されています。

参考サイト

fastladderをrailroadで図を作ってみる。

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

たっちな人がfastladderを試していたので対抗して 

railroadでモデルとコントローラの図を作ってみた。

コマンド 

railroad -C | dot -Tjpg > controller.jpg

railroad -M | dot -Tjpg > model.jpg

http://cl.pocari.org/2008-02-10-1.html

あと、こちらではもっときれいにER図つくってあるので

開発する際の参照はこちらの方がいいかと。

ちなみにrailroadはgem install railroadで入ります。 

ヘルパーメソッド

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちは。エンジニアのmimiです。

難しい話は、他の方にまかせて、私は初級者・初心者にやさしい内容を書いていきたいと思います。

今回のテーマは、「ヘルパーメソッド」

ヘルパーメソッドとは、 

リンクを貼る(a href) など、HTMLのタグを作成するためのメソッドです。

 たとえば

<%= link to "削除",  :action => 'destroy'  %>

  これは↓

<a href="/destroy">削除</a>

 というHTMLを吐き出します。

 これに、アラートを出したいときには、

<%= link to "削除",  { :action => 'destroy' }, :confirm => "削除しても本当に後悔しない?" %>

 ↓

<a href="/destroy"  onclick="return confirm('削除しても本当に後悔しない?');">削除</a>

  となり、ポップアップで「OK」か「キャンセル」のボタンが表示されます。

 URLを作成するものとしては、

<%= url_for  :controller => 'list',  :action => 'destroy'  %>

 これは、”/list/destroy”となります。:controllerを省略した場合は、現在の位置と同じになります。   

Ruby on Railsでは、直接HTMLタグを書かずに、

 ヘルパメソッドを利用するのがルールです。

ディレクトリが変更になったときにでも、対応がしやすいこともありますし、

何より終了のタグを忘れる危険性もないので、楽ですね。

他にもメソッドはたくさんありますが、今回はここまでとします。

読んでくださってありがとうございます。

Ruby標準csv遅い

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちは、ワイYです。
今回は、Rubyの標準CSVはどの程度遅いのか、FasterCSVというRubyプラグインを用いて検証してみました。

検証前の準備・RubyプラグインFasterCSVをgemを用いてインストールする。gem install fastercsv・検査データとして郵便局のHPから郵便番号CSVを取得する。

検証方法Ruby標準のbenchmarkモジュールを使って、Ruby標準CSVとRubyプラグインFasterCSVにそれぞれ郵便番号CSVを読み取らせて比較する。

検証環境

OS: Windows XP

CPU: Core 2 Duo 2.4GHz

MEMORY: 3GB

Ruby v1.8.6

fastercsv v1.2.3

プラグインFasterCSVの使い方require ‘rubygems’
require ‘fastercsv’
#CSVファイルを読み込み一行ずつ処理をする
FasterCSV.foreach(“csvファイルパス指定”){ |csv|
p row #=>配列
}


検証に用いたコード検証には、ハッシュのキーを郵便番号、値を住所を挿入するようなプログラムにしました。require ‘rubygems’
require ‘benchmark’
require ‘csv’
require ‘fastercsv’
$KCODE=’sjis’

Benchmark.bm(15) do |x|
 #FasterCSV
 x.report(” FasterCSV”) do
   hash = {}
   FasterCSV.foreach(“KEN_ALL.CSV”){ |row|
     hash[ row[2] ] = row[6] + row[7] + row[8]
   }
 end

 #ruby標準CSV
  x.report(“CSV”) do
    hash = {}
    CSV.foreach(“KEN_ALL.CSV”){ |row|
      hash[ row[2] ] = row[6] + row[7] + row[8]
    }
  end
end

結果3回実験してみたが、RubyプラグインFasterCSVの方が5倍ほど早い事がわかった。詳細は、下図を参照してください。

まとめRubyでCSV関連を扱うときはプラグインのFasterCSVを使うようにしよう。

railsで開発したダイエットサイトとそのソースコード

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちは。

体重が0.1トンでは済まなくなってきた高瀬です。

3連休の内、土日を使ってKBMJ社内で開発合宿を行いました。

その参加者の一人が最近ツイッターに体重のメールを送ってははてなグラフに読み込ませて、

ダイエット記録を出してると聞いたので、ダイエット記録を登録するサイト作ってみた。

だいえとというサイトです。

具体的には…… 

記録を登録するとぺたっと張ってるグラフの内容が簡単に更新されます。

ただそれだけですが、一応携帯からも記録を登録出来る様に作りました。

http://daieto.dip.jp/diets/show/zenpou


こんな感じのグラフです。

そしてダイエットサイトのソースコードはこちら 。

fastladderを試してみました ~rails2.0~

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちは、tacchiです。

fastladderがオープンソース

になったという記事を見て、ラボの時間を利用して、入れてみました。

検証環境

CentOS 5
Rails: 2.0.2

インストール手順

svn checkout http://fastladder.googlecode.com/svn/trunk/ fastladder-read-only

fastladder-read-onlyというディレクトリが作成されて、なかみてみるとrailsプロジェクトと
batファイルなどが入ってます。

batファイル中見ましたが、mongrel動かしたり、serviceに登録したりをシェル化しているだけです。なので、今回は特に使わず、自分で設定しました。

では、さっそくfastladerを動かすための設定をしたいと思います。

まず、DB関連。
■fastladder/config/以下にdatabase.ymlとかdatabase.yml.mysqlとかあるので環境に合わせて切り替える。自分はMySQLが元々環境に入っているので、MySQLを利用します。$ mv database.yml database.yml.base
$ mv database.yml.mysql database.yml


■DB作成します。
mysqlにログインして、DB作成します。mysql > create database fastladder_production;
Query OK, 1 row affected (0.00 sec)


■ユーザ作成mysql > grant select,insert,delete,update,create,drop,file,alter,index on *.* to fastladder@localhost identified by ‘12345’;
mysql > flush privileges;


■これだけyumでインストールできないので以下のコマンドでインストールwget http://downloads.sourceforge.net/freeimage/FreeImage3100.zip
unzip FreeImage3100.zip
cd FreeImage
make
make install


■gemで以下インストール$ gem install rfeedfinder
$ gem install feed-normalizer
$ gem install opml
$ gem install mongrel


■テーブル作成します。
fastladderディレクトリに移動して以下を実行rake db:migrate

■実行
fastladderディレクトリに移動して以下を実行script/server -d -e production
RAILS_ENV=production script/crawler > /dev/null &

まとめ

簡単にインストールできました。自分は、mongrel_clusterなどを使って起動とかさせてますが、上記で動きます。あと、INSTALL.txtとか丁寧に書いてくれてるので、参考になりました。

Railsの手動インストール

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちは。 kimiです。

今回は、Railsを手動でインストールしたケースをご紹介します。

実は、この方法をとった背景には、当サイト「DoRuby!」のローカル環境を構築する時に

RubyGemsによる自動のリモートインストールが失敗したことがきっかけです。

※Windowsでローカル環境構築をおこないます。

前回はgemコマンドについて紹介しており、その際にはRuby(1.8.5) をインストール済みです。確認もしてみましょう!

◆rubyのバージョンを確認するコマンド 

C:/>ruby -v

ruby 1.8.5 (2006-12-25 patchlevel 12) [i386-mswin32]

railsインストールの失敗談 

さて、それではgem コマンドを使って、rails の環境を構築・・・と思いきや、

C:/ruby>gem install rails

Bulk updating Gem source index for: http://gems.rubyforge.org

Install required dependency rake? [Yn]

Install required dependency activesupport? [Yn]

Install required dependency activerecord? [Yn]

ERROR: While executing gem … (Zlib::BufError)

   buffer error

なんじゃこりゃーと思いつつ、Rails に必要な gem をダウンロードしてきて

インストールすることで解決しました。

さてさて、ここからが手動のダウンロードおよびインストールになります。

あっ、ちなみに他にも解決方法はあるのですが、今回は手動をでの方法を選んでみました。 

Rails の依存ファイル群をダウンロード 

まずは、Rails の依存ファイル群をダウンロードします。今回はC:/ruby>配下に保存。

Rails 以外は rails が必要としている gem なので rails は一番最後にインストールしてください。

     ■activesupport-1.4.2.gem

     ■activerecord-1.15.3.gem

     ■actionpack-1.13.3.gem

     ■actionmailer-1.3.3.gem

     ■actionwebservice-1.2.3.gem

     ■rails-1.2.3.gem

Railsをインストール

◆RubyGemsのlocalオプションを使うことでRailsをインストールすることができる。

 下記の順にインストール。

C:/ruby>gem install activesupport --local
Successfully installed activesupport, version 1.4.2
Installing ri documentation for activesupport-1.4.2...
Installing RDoc documentation for activesupport-1.4.2...


C:/ruby>gem install actionpack --local
Successfully installed actionpack, version 1.13.3
Installing ri documentation for actionpack-1.13.3...
Installing RDoc documentation for actionpack-1.13.3...


C:/ruby>gem install activerecord --local
Successfully installed activerecord, version 1.15.3
Installing ri documentation for activerecord-1.15.3...
Installing RDoc documentation for activerecord-1.15.3...


C:/ruby>gem install actionwebservice --local
Successfully installed actionwebservice, version 1.2.3
Installing ri documentation for actionwebservice-1.2.3...
Installing RDoc documentation for actionwebservice-1.2.3...


C:/ruby>gem install actionmailer --local
Successfully installed actionmailer, version 1.3.3
Installing ri documentation for actionmailer-1.3.3...
Installing RDoc documentation for actionmailer-1.3.3...


C:/ruby>gem install rails --local
Successfully installed rails, version 1.2.3  

これでインストールが完了です。

インストールできたか確認したい場合は、C:/ruby/lib/ruby/gems/1.8/gems配下をご確認ください。 

◆※複数のVersionがインストールされている場合などは、不要なVersionを指定して

 アンインストールも可能です。

gem list                # インストールされているパッケージを確認

gem uninstall <パッケージ名>  # アンインストールコマンド

 このような流れでローカル環境構築をおこなってみましたが、まだまだ簡単に構築できる

手段は多く存在しますので、いろいろと試してみるといいでしょうね。

では、サッカー日本代表の3次予選(vsタイ戦)がそろそろ終わるので、ここらで失礼します。

(-_-)ゞ

RadiantCMSのインストール(2)

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

お久しぶりです。花吹雪です。


インストール中に中断するなよ!という声が聞こえてきそうですが、
私が戻ってきたからにはもう大丈夫。
我慢できずに自分で調べてインストールしてしまった方。ご苦労様でした。
一方、我慢して今回の書き込みを待ちわびていた方。どうもありがとう!
では早速、続きを書くとしましょうか。

日本語化の設定

確かデータベースの設定まで終わったんでしたよね。
あとはデータベースの初期化をすれば終わりなんだけど、
その前に、ここで日本語化の設定をしてみたいと思います。
「ワタシ日本語キライ」という方はこの章は飛ばしてください。


あらかじめ言っておきますが、全てが日本語になるわけではありません。
Radiantの管理画面と、編集で使用するタグのヘルプが日本語化されます。


まず、Ruby-GetText-Packageというパッケージ(バージョン1.9.0以上)
を利用するので、これをgemを使ってインストールします。インストールしたら
一応バージョンを確認してください。$ gem install gettext
$ gem list gettext (バージョンの確認)

次にRubyForgeから以下のアーカイブをダウンロードし、 Radiantのvender/extensions以下に展開します。$ cd /home/radiant_project/vendor/extensions
$ wget http://rubyforge.org/frs/download.php/23244/radiant_gettext_0.6.2.tar.gz
$ tar xvzf radiant_gettext_0.6.2.tar.gz

最後にRadiantのルートディレクトリでRakeタスクを実行します。$ cd /home/radiant_project/
$ rake radiant:extensions:gettext:setup

でですね、アーカイブのバージョンを見てもわかる通り、Radiantのバージョン0.6.2
に依存しているようなので、ここでRadiantをfreezeしておくと良いとの事。
freezeというのはアプリケーションをRAILS_ROOT/vendorの下にコピーすることを
言うんだそうです。RAILS_ROOT/vendorの下にアプリケーションがあると、そちらが
優先的に使われるんだと。とりあえず、おまじないという事でやっておいて損はない
でしょう。$ rake radiant:freeze:edge TAG=rel_0-6-2

データベースの初期化

データベースを初期化します。途中で3回の入力(1.初期化の確認、2.ログインユーザ名、
3.ログインパスワード)があるので、きちんと答えてあげてくださいね。$ rake production db:bootstrap

Radiantの実行

あとはRadiantを実行して終わりです。$ cd /home/radiant_project/
$ ruby script/server -e production


以上です。
私はこの環境、この手順でインストールできましたが、
環境やバージョンが異なるとまた違ってくると思いますので、
この記事を参考にいろいろ試してみてください。

Railsで「Lost connection to MySQL server during query」に遭遇した場合の対策

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちは!TrinityTです。

さて、先日Rais開発中に「Lost connection to MySQL server during query」というエラーが多発する現象に遭遇しました。

出力されているメッセージどおり、「MySQLのコネクションがクエリ実行中にロスとした」ということらしい。

調べてみたところ、以下のようなことが原因で発生するようです。

 ● 一回のコネクションで通信パケットが大きい場合

 ● セッションに多量の情報が入っている場合 

 ● APサーバ、DBサーバの性能が低い場合

この現象方法の対処方法として「 mysql_retry_lost_connectionというライブラリを使うことで改善される?」との情報を得たため試してみました。

検証した環境

OS:WindowXP SP2

Ruby:1.8.6(インストール済)

Rails:1.2.6(インストール済)
 

検証 

1.mysql_retry_lost_connection インストール

 既にRubyGemsで提供されているため、gemコマンドでインストールします。

 # gem install mysql_retry_lost_connection

2.require追加

railsのenvironment.rbファイルに、以下の記述を行います。

require ‘mysql_retry_lost_connection’

3. APを再起動します。

自分の開発環境で使用してみたところ、適用してから一度も「Lost connection~」現象が発生することはありませんでした。しかし、時折無限コネクションループに陥り、APが固まってしまう現象が発生しました。

結論

コネクションループ現象が非常に怖いため、本番サーバでつかうのは止めたほうが良いと思います。しかし非力な開発環境などで本現象に悩まされている場合には、適用してみてはいかがでしょうか?

Linuxとかのbashで使えるショートカットキーをまとめた一覧

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちは。

高瀬です。昔自分のブログにて書いたbashとかzshとかcshで使える

ショートカットキーの一覧を投稿してみます。

zshを使っている時によく使ってるショートカットキーを紹介してみる。

^はコントロールキーを押しながらと言う意味で使っています。

基本っぽいもの

コマンド意味
tabコマンドやファイルの自動補完(足りない文字を補完してくれる
^c実行中のコマンドを停止
^z実行中のコマンドを一時停止(fgで再開)

履歴系

コマンド意味
^pコマンドのひとつ前の履歴を呼び出す。(↑でも可)
^nコマンドのひとつ後の履歴を呼び出す。(↓でも可)
^rコマンドの履歴を検索する。

移動系

コマンド意味
^a一文字目に移動(homeキー)
^e最後に移動(endキー)
^f右に移動
^b左に移動

文字削除

コマンド意味
^k現在のカーソル位置から末尾まで削除
^d一文字削除(delキー)
^h一文字削除(BackSpaceキー)
^y削除した文字を貼り付け

画面操作

コマンド意味
^l画面をクリアする。
^s画面表示を停止する。
^q画面表示を再開する。

その他

コマンド意味
^dログアウト。

長い文字列をカットして表示するプログラム

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちは。
KBMJでRuby on Railsを使ったWebの開発をしている本多と申します。

今回は「指定の文字数より長ければカットして表示する」というプログラムを紹介したいと思います。

Ruby のソースコードは以下です。

$KCODE=’u’ #文字コードを指定。今回はutf-8の場合
require ‘jcode’ #jlength(マルチバイトの文字列の長さを取得するメソッド)を使用するためにjcodeを読み込む

def cut_off(text, len)
  if text != nil
    if text.jlength < len
      text
    else
      text.scan(/^.{#{len}}/m)[0] + “…”
    end
  else
    ”
  end
end

puts cut_off(“任意の文字列”, 任意の文字数(整数))

上のソース内のtextとは「カットしたい文字列」、lenとは「カットしたい長さ」です。
指定の文字数よりも長い場合に正規表現を用いて先頭からlenの長さだけ文字列を抜き取り、末尾に”…”を付加したものを返します。
[0]が付いていますが、これはscanという関数が「パターンにマッチした文字列を、マッチした数だけ配列で返す」という特徴を持っているため、
text.scan(/^.{#{len}}/m) + “…”と書いてしまうと


[“マッチした文字列”] + “…”


になってしまい、配列 + 文字列という処理を行おうとしてエラーが出ます。

textの中身がlenより短い文字列の場合はそのまま返します。

この関数の最大の魅力は「日本語(マルチバイト)に対応しているという点です」
例えばcut_off(“こんにちは。KBMJの本多です。”, 10)と書くことで
「こんにちは。KBMJ…」という文字を得ることができます。


注意点としては、必ず『$KCODEの宣言』と『jcodeの読み込み』を行うようにしてください。
$KCODEが宣言されていない場合は正常な文字数で取り出せず、
jcodeが読み込まれていない場合はNoMethodErrorが出てしまいます。

ちなみに Ruby on Rails でcut_offを使用する場合はソースを書く場所がそれぞれ以下になります。

(RAILSROOT)/config/environment.rb

先頭の行に追加

$KCODE = ‘u’
require ‘jcode’
# Be sure to restart your web server when you modify this file.

# Uncomment below to force Rails into production mode when
————————-中略—————————-


(RAILSROOT)/app/helpers/application_helper.rb

# Methods added to this helper will be available to all templates in the application.
module ApplicationHelper

  def cut_off(text, len)
    if text != nil
      if text.jlength < len
        text
      else
        text.scan(/^.{#{len}}/m)[0] + “…”
      end
    else
      ”
    end
  end

end


(RAILSROOT)/app/views/hoge/hogehoge.rhtml

<%= cut_off(“文字列”, 20) %>


これでRails上でも任意の文字数でカットできるようになりました。

例えばブログのタイトルのみを表示させるインデックスを作成する際、
長すぎるタイトルをそのまま表示するとレイアウトが崩れる原因になることがあります。
そんな時に役に立つのが、このcut_offです。
是非活用してみてください。
それでは。

GOOD RAILS!!

Scaffoldはどこからくるの? 後編

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちは。
KBMJのエンジニアの高瀬です。

大分間が空いてしまいましたが、前回の続きを書く事にします。
前回は、http://doruby.kbmj.com/zenpou_on_rails/20071227/Scaffold___

前回はscaffoldを作って以下の様なファイルが出来ました。
     create  app/views/members
      create  app/views/members/index.html.erb
      create  app/views/members/show.html.erb
      create  app/views/members/new.html.erb
      create  app/views/members/edit.html.erb
      create  app/views/layouts/members.html.erb
      create  public/stylesheets/scaffold.css
      create    app/models/member.rb
      create    test/unit/member_test.rb
      create    test/fixtures/members.yml
      create    db/migrate
      create    db/migrate/001_create_members.rb
      create  app/controllers/members_controller.rb
      create  test/functional/members_controller_test.rb
      create  app/helpers/members_helper.rb

こちら、どこから来るのかを調べて行こうと思います。

結論を先に述べると、以下のパスにテンプレートが存在します。
{railsのインストール先}/lib/rails_generator/generators/components/scaffold/
これがどのような仕組みになっているかを追いかけて行きます。

前回、scaffoldは以下のコマンドによって生成されました。

      ruby script/generate scaffold Member name:string discription:text birthday:datetime
rubyの構文はruby –helpによって出してみたところ
    Usage: ruby [switches] [–] [programfile] [arguments]

      -0[octal]       specify record separator (\0, if no argument)
      -a              autosplit mode with -n or -p (splits $_ into $F)
      -c              check syntax only
      -Cdirectory     cd to directory, before executing your script
      -d              set debugging flags (set $DEBUG to true)
      -e ‘command’    one line of script. Several -e’s allowed. Omit [programfile]
      -Fpattern       split() pattern for autosplit (-a)
      -i[extension]   edit ARGV files in place (make backup if extension supplied)
      -Idirectory     specify $LOAD_PATH directory (may be used more than once)
      -Kkcode         specifies KANJI (Japanese) code-set
      -l              enable line ending processing
      -n              assume ‘while gets(); … end’ loop around your script
      -p              assume loop like -n but print line also like sed
      -rlibrary       require the library, before executing your script
      -s              enable some switch parsing for switches after script name
      -S              look for the script using PATH environment variable
      -T[level]       turn on tainting checks
      -v              print version number, then turn on verbose mode
      -w              turn warnings on for your script
      -W[level]       set warning level; 0=silence, 1=medium, 2=verbose (default)
      -x[directory]   strip off text before #!ruby line and perhaps cd to directory
      –copyright     print the copyright
      –version       print the version


となっています。
今回の場合、      “script/generate”[

がprogramfileで      “scaffold Member name:string discription:text birthday:datetime”
がargumentsになります。


というわけで、プログラムファイルの内容を見て見ましょう。
script/generateの中身はこんな内容になっています。      #!/usr/bin/env ruby
      require File.dirname(__FILE__) + ‘/../config/boot’
      require ‘commands/generate’


require は、ライブラリの呼び出しを行います。
ここで、      require File.dirname(__FILE__) + ‘/../config/boot’


は、プロジェクトのrailsの呼び出しを行っているRailsの基本的な所ですので、      require ‘commands/generate’


を見てみる事にします。
{Railsのインストール先}/lib/commands/generate.rb
を参照しましょう。      require “#{RAILS_ROOT}/config/environment”
      require ‘rails_generator’
      require ‘rails_generator/scripts/generate’

      ARGV.shift if [‘–help’, ‘-h’].include?(ARGV[0])
      Rails::Generator::Scripts::Generate.new.run(ARGV)


Railsのenvironment(環境の設定等)を呼び出し、rails_generatorとrails_generator/scripts/generateを呼び出して、
います。

ちょっと文章がソースばかりになるので、省略しますが、      require ‘rails_generator’


のrails_generator.rbにて、      require ‘rails_generator/base’
      require ‘rails_generator/lookup’
      require ‘rails_generator/commands’
      require ‘rails_generator/simple_logger’


など、generatorのファイルを呼び出しています。
そして、lookupによって下記のフォルダにあるファイルをgeneratorのコマンドに取り込んでいます。      #{::RAILS_ROOT}/lib/generators
      #{::RAILS_ROOT}/vendor/generators
      #{::RAILS_ROOT}/vendor/plugins/*/**/generators
      #{::RAILS_ROOT}/vendor/plugins/*/**/rails_generators
      #{Dir.user_home}/.rails/generators
      #{File.dirname(__FILE__)}/generators/components


そして実行段階。/lib/commands/generate.rbの中で実行されていたrunコマンドを見てみます。      Rails::Generator::Scripts::Generate.new.run(ARGV)


クラス名Rails::Generator::Scripts::Generateなのでrails_generator/scripts/generate.rbを見に行きます。
/lib/commands/generate.rbで3行目でrequireされてましたね。
見てみると      require File.dirname(__FILE__) + ‘/../scripts’

      module Rails::Generator::Scripts
        class Generate < Base
          mandatory_options :command => :create
        end
      end

というコードになっています。
run呼び出してるのにrunがない……。
Rails::Generator::Scriptsを拡張してるみたいです。
いったりきたりで大変ですね。

というわけでrails_generator/scripts.rbにいきます。        def run(args = [], runtime_options = {})
          begin
            parse!(args.dup, runtime_options)
          rescue OptionParser::InvalidOption => e
            # Don’t cry, script. Generators want what you think is invalid.
          end

          # Generator name is the only required option.
          unless options[:generator]
            usage if args.empty?
            options[:generator] ||= args.shift
          end

          # Look up generator instance and invoke command on it.
          Rails::Generator::Base.instance(options[:generator], args, options).command(options[:command]).invoke!
        rescue => e
          puts e
          puts ”  #{e.backtrace.join(“\n  “)}\n” if options[:backtrace]
          raise SystemExit
        end
長いのでrunのコードだけ採用しています。
Rails::Generator::Base.instance(options[:generator], args, options).command(options[:command]).invoke!
にてジェネレータを見つけ、lookupでロードしたgenaratorの manifestを呼び出しています。
ここに関するコマンドはlib/rails_generator/commands.rbなどに定義されているのでそこから掘っていってください。

というわけで、送った”scaffold Member name:string discription:text birthday:datetime”の最初のscaffoldの指定により、
scaffoldを呼び出します。

ということで、lookupの中のソースコード一覧の中で、scaffoldのソースコードが存在するのは
{railsのインストール先}/lib/rails_generator/generators/components/scaffold/
でしたので、scafolldはここから来ている事がわかりました。

今回、
Rails::Generator::Base.instance(options[:generator], args, options).command(options[:command]).invoke!
を検索している際、ヒットした
http://d.hatena.ne.jp/elm200/20070718/1184736852を途中から参考にさせていただきました。

というか、既にこちらのエントリがあったという事で、今回のエントリは二番煎じだったかな……と思いましたが、

とりあえず後悔公開CHUです。

aptanaのインストールと使い方について

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちは、KBMJの中平@railsエンジニアです。

本日は、私がrailsの開発で使用している「aptana」について紹介いたします。

aptanaとはeclipseベースで作られたIDEの一つです。また、eclipseのプラグインとして、aptanaを使用することも可能になっています。
aptanaは複数の言語での開発が可能で、ruby on rails の開発はもちろんphpなどの開発も可能です。
また、web編集に優れており、CSSやjavascriptの作成もしやすいという特徴があります。

参考に
http://ja.wikipedia.org/wiki/Aptana

今回は、このaptanaインストール使い方日本語化などについて書きたいと思います。■Aptana Stadioをインストールする。

  1. aptanaを動かすには、javaが必要なので、jreもインストールしておく。
  2. 続いてAptana Stadioをダウンロードしておき、インストール。
  3. 起動してみて問題なければOKです。

このままでも使えますが、日本語化したい場合は
eclipseの日本語化プラグインを使います。(aptanaはeclipseをベースに作られているため使用可能)
Pleiadeをダウンロードします。
Pleiadesをインストール(read meを参考にしてください)後、aptanaを再起動し、日本語化されていれば成功です。

■radrailsのプラグインインストール
aptanaインストールしただけでは、まだrailsの開発はできませんので、
radrailsというrails開発用のプラグインをインストールします。

  1. aptanaのヘルプ→ソフトウェア更新→検索およびインストールを選択
  2. インストールする新規フィーチャーを選択し、radrailsにチェックをいれて、次へを押してインストールを行います。


■aptanaでrailsやmongrel_railsを使うための設定

aptanaのツールバーから「ウィンドウ→設定」画面が開いたら「railsの項目」を選択し、使用するrails、rake、mongrel_railsのパスを設定します。

その他の項目は個人の環境や好みで調整してください。ここでは省略します。

mongrelはあらかじめインストールが必要です。

■railsプロジェクトの作成方法

aptanaのツールバーから「ファイル→新規作成→railsプロジェクト」を選んで作成します。
コマンドの rails hogehoge と一緒です。

■aptanaの使い方

ここからは個人の好みもありますが、
WEBrick(mongrel)の起動や、rake、ジェネレートの実行など、aptana上での使い方を説明します。

まず、aptanaのツールバーの「ウィンドウ→ビューの表示」から サーバー、rake タスク、ジェネレーターをそれぞれ選択
すると、それぞれの操作用のウィンドウ枠が下のほうに表示されます。
・サーバー(webrick,mongrelの起動)

 サーバーのウィンドウで右クリックし、プロジェクトと、サーバーのタイプを選び作成します。
 サーバーを起動するときは、緑色の矢印ボタンを押せばOKです。


・rake

 特に設定無し、実行したいrake を選ぶか 入力ボックスにコマンドを直接書いて実行してもOKです。


・ジェネレーター

作成したいものを選択ボックスから選んで入力ボックスに名前を書いて実行。

ちなみに、作成したのも削除するのもここで出来ます。


・そのほかにも、gem installや自動テストもaptanaで行うことが可能です。
・DBのテーブルも見ることが出来ますが、重いので余りお勧めできません。

・他にも色々な使い方ができますが、紹介し切れませんので、また後日面白い機能があれば紹介したいと思います。

また、aptanaは総合開発環境になっていて、ruby(rails)のほかにもphpやAir、iphoneの開発もプラグインを入れることで可能です。

私の周りでは、vimを使って開発している人が多いのですが、eclipseなどのIDEが慣れているという人はaptanaをインストールしてみてはいかがでしょうか?

追記

aptanaでrailsをデバッグする方法はこちらです。

ローカルメールサーバーでRailsでのメール受信のテストを便利に

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

 こんにちは。

 KBMJでRuby on Rails を使ったweb開発に携わっているyoppiといいます。

 メールを受信して処理する機能がある場合、いちいちテストサーバーにコードをアップしてとか面倒くさくないですか?

 Rails限定ですが、今回は、メール受信の処理をローカルで実行できるようになる方法をご紹介します。

 ActionMailServer – テストとか

 ローカルでテストするためのメールサーバーはこちらを使用します。設定・起動方法は上記ページに書いてありますのでご参照下さい。

 自分がよくわからなかったのは、Outlook ExpressやThunderbirdなどからローカルのメールサーバーにメールを送るのはどうしたらよいかということでした。

 結局は、ローカル受信テスト用のアカウントを新たに作成して、そのアカウントの送信(SMTP)サーバーのサーバー名にlocalhost、ポート番号に起動時に設定したもの(上記サイトだと10025)にすればいいだけでした。

 ユーザー名とパスワードの設定の部分は、指定しないにします。

Thunderbirdで送信サーバーを設定する場合

 ※Thunderbirdでは、アカウントの設定と送信サーバーの設定が別の項目として分かれているので注意が必要です。

 あとは、この作成したアカウントでメール作成を行い、送信すればオッケーです。上記サイトの例だと宛先を@example.comで終わるアドレスにしないと受信されません。どんなアドレスでも受信してほしい場合は、server.filter_rcpt の部分をコメントしておけばいいと思います。

Let’s enjoy testing!

railroadを用いたER図作成

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちは。

KBMJでRuby on Rails を使ったweb開発に携わっているワイYといいます。

今回は、railroadを用いてRailsアプリのER図を作成してみたいと思います。

実行環境

OS Windows XP

Rails-1.2.5

postgres-8.2.5

graphviz-2.16.1 (railroadで出力したファイルを表示、変換するのに使用します)

etc

実行手順

gemを使ってrailroadをインストールします。gem install railroad

・ER図を生成したいrailsアプリのルートに移動します。

・下記のコマンドを実行すると、モデルのER図(models.dot)が作成されます。railroad -o models.dot -M
補足:-MとするとモデルのER図が生成され、-Cに変更するとコントローラーのER図が生成できます。-oで出力先を指定する事もできます。

・出力された.dotファイルはGraphvizを使う事で、表示させたり、jpgやpngなどに変換する事ができます。

・実際にできた画像は下図のようになります。

railroad

最近人気な記事