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

ActiveSupportのオートロード機能

以下の条件を満たせば、外部ファイルに対する読み込み宣言なしで、クラスが参照された瞬間に自動的に読み込まれる。
・ロードパス上にファイルを配置する。
・クラス(モジュール)名をアンダースコア化したファイル名にクラスを定義する。(アンダースコア化はActiveSupportのString#underscore, String#classifyで確認できる)

Ruby-GetText

Ruby-GetText の導入
Ruby-GetText の導入 - Rails で行こう! - Ruby on Rails を学ぶ
Windowsの場合は、gtk+-win32-devel をインストールしておく。
Glade/Gtk for Windows

モデルの修正
モデルで修正する必要があるのは、独自の検証処理用メッセージと、データベースとは直接結びつかないフィールド。
フィールドは、N_('クラス名|フィールド名')で定義する。
パタメータ付きの翻訳

flash[:notice] = _('Event %{event} was successfully created.') % {:event => @event.title}
msgid "Event %{event} was successfully created."
msgstr "イベント「%{event}」を登録しました。"

Ruby-GetTextの詳しい説明
Ruby on RailsでRuby-GetText-Packageを使う - よたらぼ 保管庫
ActiveRecord::Observer + GetTextで翻訳文字列が抽出できなくなる
Observerを使用していると、データベースのテーブル名とフィールド名が自動的に翻訳文字列として抽出されなくなる。以下に回避方法あり。
よたらぼ(2007-10-24)
Emacsでpoファイルを編集
MacOSXのCarbon Emacsで.poファイルを開いて編集しようとしたら、普通に編集できない。困ったなと思ったが、これはPOモードになっているからで、実は便利だった。
Rails Ruby-GetText は、emacs のPOモードでさらに快適:Goodpic

EmacsでRuby on Rails

/home/dima :: Rails On Emacs (in english)
RubyForge: emacs-rails: Project Info
Mac OS X の場合
Carbon Emacsをインストールすれば、必要なファイルは含まれているので、それらを有効にするよう.emacs.elに記述すればよい。下記の.emacs.el記述例を参照。
Windowsの場合

  • EmacsW32+Emacsをインストール。
    ※EmacsW32+Emacsは環境変数でSHELL=/bin/bashを設定しているとうまく動作しないので、cygwinのために設定している場合は削除する。
  • 環境変数HOMEを設定
  • 必要なelファイルをsite_lispにコピー
    ruby\src\misc\*.el
    inf_ruby.el
    snippet.el
    find-recursive.el
  • %HOME%\.emacs.dに、RubyForge: emacs-rails: Project Infoからダウンロードしたemacs-railsをコピー。
  • %HOME%\.emacs.elを作成。
    各elのコメントと/home/dima :: Rails On Emacs (in english)を参考にして、記述する。
  • .emacs.el記述例

    (autoload 'ruby-mode "ruby-mode"
      "Mode for editing ruby source files" t)
    (setq auto-mode-alist
          (append '(("\\.rb$" . ruby-mode)) auto-mode-alist))
    (setq interpreter-mode-alist (append '(("ruby" . ruby-mode))
    				     interpreter-mode-alist))
    (autoload 'run-ruby "inf-ruby"
      "Run an inferior Ruby process")
    (autoload 'inf-ruby-keys "inf-ruby"
      "Set local key defs for inf-ruby in ruby-mode")
    (add-hook 'ruby-mode-hook
          '(lambda ()
             (inf-ruby-keys)
    ))
    (require 'find-recursive) 
    (setq load-path (cons "~/.emacs.d/emacs-rails" load-path))
    (require 'rails)
    

    ruby-modeとruby-electricのセットアップ方法は、下記にも説明がある。
    Emacs and Ruby | HyperionReactor
    その他
    Using Emacs for Rails development - The perfect setup « Devcraft
    (関連)
    pylori*style wiki - Emacs用rails.el

migrationでforeign keyを定義する

UsingMigrations in Ruby on Rails

class CreateLineItems < ActiveRecord::Migration
  def self.up
    create_table(:line_items) do |t|
      t.column(:product_id, :integer, :null => false)
      t.column(:quantity, :integer, :null => false, :default => 0)
    end
    # This line is required if you're running a version of MySQL prior to 4.1.2
    #add_index(:line_items, [:product_id], :name => 'fk_line_items_product')
    execute('ALTER TABLE line_items ADD CONSTRAINT fk_line_items_product FOREIGN KEY ( product_id ) REFERENCES products( id ) ')
  end
  def self.down
    drop_table(:line_items)
  end
end

require_dependency

http://wiki.rails2u.com/require_dependency/
以下引用


require_dependency


require_dependency
ってなんなんだろ。しょっちゅうrailsソース内ででてくるけど。ということで調べてみた。


require_dependency
を定義している場所

activesupport/lib/active_support/dependencies.rbの

Object.send(:define_method, require_dependency)  { |file_name| Dependencies.depend_on(file_name) }

define_methodで定義してる。最初 'def

require_dependency
'
で検索したけどひっかからなくてここにたどり着くまでそこそこ時間がかかった、、、。

requireとの違い


require_dependency
で呼び出しているメソッド、depend_onは

<code> def depend_on(file_name, swallow_load_errors = false)
   unless loaded.include?(file_name)
     loaded << file_name
     begin
       require_or_load(file_name)
     rescue LoadError
       raise unless swallow_load_errors
     end
   end
 end
</code>

同じ引数で呼び出されていなければrequire_or_loadメソッドを実行する。んでrequire_or_loadメソッドは

<code> def require_or_load(file_name)
   file_name = "#{file_name}.rb" unless ! load? || file_name[-3..-1] == '.rb'
   load? ? load(file_name) : require(file_name)
 end
</code>

1行目で.rbだったり拡張子無しだったりするときの処理を。つーか解りにくいよ…。

<code>   file_name = "#{file_name}.rb" unless ( (! load?) || file_name[-3..-1] == '.rb')
</code>

load?がtrueじゃない、かつファイル拡張子が.rbじゃ無いならfilenameは"#{file_name}.rb"になる、か。ここはさして重要じゃなくて次の

<code>   load? ? load(file_name) : require(file_name)
</code>

でload?メソッドがtrueならloadメソッドで呼び出し、そうじゃなかったらrequireメソッドで呼び出しを行う。んでloadメソッドは

<code> @@mechanism = :load
 mattr_accessor :mechanism
 def load?
   mechanism == :load
 end
</code>

と定義されているため、何にも変更しなきゃrequire_dependencyを使うとloadメソッドで読み込まれると。デフォルトのgeneratorで生成した場合、RAILS_ROOT/config/environments/development.rbには

<code>Dependencies.mechanism                             = :load
</code>

RAILS_ROOT/config/environments/production.rbには

<code>Dependencies.mechanism                             = :require
</code>

と記述されてるのでproductionだとloadじゃなくてrequireされる。

で、んじゃrailsにおけるloadとrequireの大きな違いって何って事ってになるけど、fastcgiやwebrickでrails使ってる場合はloadでライブラリをロードしたときはもう一度無条件ロードされるため、ライブラリソースに変更があった場合はその変更が反映される。
requireの場合はすでに読み込んであったら読み込まない。通常のcgiで使ってる場合にはほとんど変わりなし。

だからdevelopmentではloadで、productionではrequireになってるんだね。自作ライブラリを作りったり修正したりしつつrailsの開発を進める場合はrequire_dependencyで読み込んでおくといいよ、と。