====== Rails ====== ===== セットアップ ===== ==== Rails の最新版をインストール ==== gem install rails ==== Rails のバージョンを指定してインストール ==== gem install rails -v 2.0.5 ==== Rails のバージョンを確認 ==== rails -v ==== ruby-vim ==== gem install vim-ruby vim-ruby-install.rb vim-ruby-install.rb は $RUBY_HOME/gems/1.8/gems/vim-ruby-<バージョン>/bin にインストールされます。 ===== 設定 ===== ==== アプリケーションからデータベースにアクセスしない場合の設定 ==== config/environment.rb を編集。 # config.frameworks -= [ :active_record, :active_resource, :action_mailer ] となっているところを config.frameworks -= [ :active_record ] に変更して保存し、ActiveRecord フレームワークを使わないようにします。 ===== アプリケーション作成 ===== ====アプリケーションを作成 ==== rails <アプリケーション名> === バージョンを指定してアプリケーションを作成 === rails _2.0.5_ <アプリケーション名> ==== config/database.yml の設定に従ってデータベースを作成 ==== _development rake db:create _test rake db:create RAILS_ENV=test _production rake db:create RAILS_ENV=production ==== scaffold 実行 ==== script/generate scaffold website title:string url:string comment:text ==== DB の migrate を実行(マイグレーションファイルの内容をDBに反映) ==== rake db:migrate ==== コントローラ作成 ==== script/generate controller <コントローラ名> === コントローラと同時にビューとビューに対応するメソッドを作成 === script/generate controller <コントローラ名> <ビュー名> ===== モデル ===== ==== validation ==== * validates_presence_of :<データ名>[, <データ名>..] * validates_numericality_of :<データ名>[, <データ名>..] * validates_length_of :<データ名>, :within => <最小桁数>..<最大桁数> * validates_confirmation_of :<パスワード項目名> * validates_uniqueness_of :<データ名> [, <データ名>..] [, :case_sensitive => [true|false] * validates_format_of :<データ名>[, <データ名>..], :with => %r{<フォーマット>}[i], :message => <メッセージ> ==== DB に対するデフォルトの設定を変更 ==== === テーブル名 === class SomeTable < ActiveRecord::Base set_table_name :some end クラス名が SomeTable の場合、デフォルトでは some_tables を参照しますが、some を参照するように変更。 === プライマリキーカラム === マイグレーション定義 class CreateSomeTable < ActiveRecord::Migration def self.up create_table :sometable, :primary_key => :code do |t| t.string :name, :limit => 20 t.timestamp end end def self.down drop_table :sometable end end code というカラムが integer, auto increment でプライマリキーとして作成されます。 class SomeTable < ActiveRecord::Base set_primary_key :code end デフォルトでは id カラムをプライマリキーとして参照しますが、code を参照するように変更。 === プライマリキーに文字列(VARCHAR)カラムを指定 === class CreateSomeTable < ActiveRecord::Migration def self.up create_table :sometable, :primary_key => :code do |t| t.column :code, :string, :limit => 20 t.string :name, :limit => 20 t.timestamp end end def self.down drop_table :sometable end end === 複合プライマリキー === プラグイン「composite_primary_keys」をインストール gem install composite_primary_keys config/environments.rb の末尾に追記 require 'composite_primary_keys' テーブルの定義 class CreateSomeTable < ActiveRecord::Migration def self.up create_table :sometable, :primary_key => [:code, :subcode] do |t| t.column :code, :string, :limit => 6 t.column :subcode, :string, :limit => 2 t.string :name, :limit => 20 t.timestamp end end def self.down drop_table :sometable end end 複合プライマリキーの定義 class SomeTable < ActiveRecord::Base set_table_name :sometable set_primary_keys :code, :subcode end 複合プライマリキーでの検索 row = SomeTable.find([1,1]) プライマリキー項目が文字列(VARCHAR)の場合は、文字列を指定。 row = SomeTable.find(['1','1']) ※composite_primray_keys のバージョンによって、ActiveSupport に依存があるので注意 ^composite_primary_keys^ActiveSupport^ |2.2.2|>=2.2.0(2.3.0でもOKだった)| |1.1.0|>=2.1.2| |1.0.10|>=2.1| |0.9.93|=2.0.2| Rails 2.0.5 の場合、1.0.10 も 0.9.93 のどちらも適合しないため使えなかった。 ===== コントローラ ===== ===== ビュー ===== ==== anchor ==== * 表示:entry_path(<対象モデル名>) * 一覧:entries_path * 編集:edit_entry_path(<対象モデル名>) * 新規:new_entry_path ==== partial ==== * render :partial => '<ビュー名>' # _ビュー名.html.erb を参照 * render :partial => @<モデル名> ==== flash ==== if flash[:notice] flash にメッセージがある場合のみ表示 ==== ヘルパーメソッド ==== === タグ処理 === == content_tag == <%= content_tag(:div, flash[:notice], :id => 'notice') if flash[:notice] %> == stylesheet == <%= stylesheet_link_tag '<スタイルシート1>', '<スタイルシート2>' %> === 変換系 === == h == HTML タグをエスケープ == number_to_currency == 数値を通貨記号付きの書式で変換 http://api.rubyonrails.org/classes/ActionView/Helpers/NumberHelper.html#M001464 ==== その他 ==== * simple_format(auto_link(<モデル名>.<データ名>)) * error_messages_for :<データ名> ===== 構成 ===== ==== config/route.rb ==== (例) * map.signup '/signup', :controller => 'user_sessions', :action => 'new' * map.login '/login', :controller => 'sessions', :action => 'new' * map.logout '/logout', :controller => 'sessions', :action => 'destroy' ===== スクリプト ===== ==== scaffold ==== * ruby script/generate scaffold <コントローラ名> <モデル名> # 1.2.x * ruby script/generate scaffold <モデル名> <データ名>:<データ型> [<データ名>:<データ型>..] ==== generate ==== === controller === ruby script/generate controller <コントローラ名> === migration === == テストデータ作成 == ruby script/generate migration add_test_data(マイグレーション名) ===== プラグイン ===== ==== gettext(メッセージ日本語化) ==== === インストール === sudo gem install gettext === config/environment.rb === require 'gettext/rails' 最後に追加(最後の end の後ろ) === controller/application.rb === init_gettext "<アプリケーション名>" ==== restful_authentication(認証) ==== vender/plugins/restful_authentication === URL === http://svn.techno-weenie.net/projects/plugins/ === controller/application.rb === include AuthenticatedSystem === controller/<認証経由させたいコントローラ> === before_filter :login_required ==== file_column ==== vender/plugins/file_column === URL === http://filecolumn.googlecode.com/svn/tags/ ==== ImageMagick ==== sudo port install ImageMagick gem install rmagick ==== will_paginate ==== gem install will_paginate === 設定 === config/environment.rb の最後に追加 require 'will_paginate' === コントローラ === @users = User.paginate :page => params[:page], :per_page => 10 === ビュー === <% for user in @users -%> <% end -%>
<%= link_to user.name, :action => 'edit', :id => user.id %>
<%= will_paginate @users %>
====== 気付いたこと ====== ===== ActionRecord ===== ==== Update_all ==== * update_all メソッドでデータを更新すると、updated_at カラムの値(更新日付)が更新されない。 ===== trouble shooting ===== ==== gettext ==== === モデル名とテーブル名が異なる場合 rake gettext:updatepo でエラーが発生 === エラーメッセージ undefined method `untranslate_all?' for Master(code: string, no: integer, name: string):Class config/environment.rb の最後に次の行を追記 require 'gettext/rails' === undefined method `set_primary_keys' が発生 === 回避策はあるかも知れないが、とりあえず無視しておく。 === rake gettext:updatepo を実行するとエラー === == 現象 == rake gettext:updatepo を実行すると次のエラーメッセージが出力される。 rake aborted! `msgmerge' may not be found. Install GNU Gettext then set PATH or MSGMERGE_PATH correctly. == 対応 == - 「[[http://www.yotabanana.com/lab/20070714.html#p04|2. GNU Gettextが入っていない環境ではrmsgmergeを使う]]」を参考に「Ruby-GNOME2 Win32 GUI Installer」をダウンロードするには - http://ruby-gnome2.sourceforge.jp/hiki.cgi? の「Download」をクリック - ruby-gnome の最新リリースには Windows Installer が用意されていないので - 「ruby-gnome2」をクリックして「ruby-gnome2-0.16.0」をクリックし、 - [[http://downloads.sourceforge.net/ruby-gnome2/ruby-gnome2-0.16.0-1-i386-mswin32.exe?use_mirror=jaist|ruby-gnome2-0.16.0-1-i386-mswin32.exe]] をダウンロード - インストールされるファイルに msgmerge が含まれているので PATH に追加。\\ (C:\Program Files\ruby-1.8 ディレクトリ以下にファイル・フォルダが追加されるかたちでインストールされる。⇒ C:\Program Files 以下に専用のフォルダを作ってインストールされる訳ではない) * PATH に追加するパス\\ C:\Program Files\ruby-1.8\lib\GTK\bin == Mac == Mac の場合は Locomotive を入れるそうです。\\ [[http://d.hatena.ne.jp/kurusaki/20080830/p3|Ruby-GetTextで`msgmerge' may not be found. - kurusaki note]]