認証機能 authenticated
アプリケーションを提供する立場にあるとき、無償の場合であってもユーザを限定して利用してもらうためには、何らかの仕組みが必要となります。それが認証機能です。今回はRuby on Rails上のアプリケーションに実装します。
1-1.プロジェクトの生成
(1) プロジェクトAppli004を生成する
(2) 日本語環境の設定
(3) データベースの作成
1-2.ログイン認証プラグインacts_as_authenticatedのインストール
(1) プラグインの導入
D:\Rails_Projects\Appli004>ruby script/plugin install http://svn.techno-weenie.net/projects/plugins/acts_as_authenticated
+ ./CHANGELOG
+ ./README
+ ./generators/authenticated/USAGE
+ ./generators/suthenticated/authenticated_generator.rb
+ ./generators/suthenticated/templates/authenticated_system.rb
+ ./generators/suthenticated/templates/authenticated_test_helper.rb
+ ./generators/suthenticated/templates/controller.rb
+ ./generators/suthenticated/templates/fixtures.yml
+ ./generators/suthenticated/templates/functional_test.rb
+ ./generators/suthenticated/templates/helper.rb
+ ./generators/suthenticated/templates/index.rhtml
+ ./generators/suthenticated/templates/login.rhtml
+ ./generators/suthenticated/templates/migration.rb
+ ./generators/suthenticated/templates/model.rb
+ ./generators/suthenticated/templates/signup.rhtml
+ ./generators/suthenticated/templates/unit_test.rb
+ ./generators/suthenticated_mailer/USAGE
+ ./generators/suthenticated_mailer/authenticated_mailer_generator.rb
+ ./generators/suthenticated_mailer/templates/activation.rhtml
+ ./generators/suthenticated_mailer/templates/notifier.rb
+ ./generators/suthenticated_mailer/templates/notifier_test.rb
+ ./generators/suthenticated_mailer/templates/observer.rb
+ ./generators/suthenticated_mailer/templates/signup_notification.rhtml
+ ./install.rb
acts_as_authenticated generator
====DEPRECATED: Use restful_authentication instead. Or, ask me for commit rights if
you wish to maintain this plugin.This is a basic authentication generator for rails, very much in the spirit of x
al's original Login Generator.To use:
./script/generate authenticated user account
This generates a basic user model, a controller, some basic views, and tests. E
xtra functionality can be unlocked by
removing the comments for them. I have a few examples such as user activation a
nd reversible encrypted passwords.This user migration is also generated unless you pass --skip-migration.
Generate your mailer:
./script/generate authenticated_mailer user
Consult the Acts As Authenticated wiki for more: http://technoweenie.stikipad.co
m/plugins/show/Acts+as+Authenticated
(2) authenticatedの生成
D:\Rails_Projects\Appli004>ruby script/generate authenticated user account
exists app/models/
exists app/controllers/
exists app/helpers/
exists app/views/account
exists test/functional/
exists test/unit/
create app/models/user.rb
create app/controllers/account_controller.rb
create lib/authenticated_system.rb
create lib/authenticated_test_helper.rb
create test/functional/account_controller_test.rb
create app/helpers/account_helper.rb
create test/unit/user_test.rb
create app/views/account/index.rhtml
create app/views/account/login.rhtml
create app/views/account/signup.rhtml
exists db/migrate
create db/migrate/20100204014203_create_users.rb
(3) NetBeansで[データベースマイグレーション]を選択し、[現在のバージョンへ]を実行します。
(in D:/Rails_Projects/Appli004)
== CreateUsers: migrating ====================================================
-- create_table("users", {:force=>true})
-> 0.1410s
== CreateUsers: migrated (0.1410s) ===========================================
(4) 動作確認
WEBrickを立ち上げます。
(5) signupの実行
ブラウザからhttp://127.0.0.1:3000/account/signupを起動します。signup画面が表示されます。
(6) テストデータの投入
数件登録してみましょう。
Login | Password |
---|---|
akagi | pwAkagi |
ito | pwIto |
ueno | pwUeno |
(7) loginの実行
次にブラウザからhttp://127.0.0.1:3000/account/loginを起動します。login画面が表示されます。
login動作を確認します。併せてhttp://127.0.0.1:3000/accunt/logoutの動きも確認してください。
1-3.ログイン認証プラグインの改良
通常のアプリケーションでは、上記のloginとlogoutを使いますが運用上loginに不足している機能があります。
それはパスワード変更機能です。ここではログイン時にパスワード変更機能を持たせるための改良を行います。
(1) ビューの修正
<% form_tag do -%>
<p><label for="login">Login</label><br/><%= text_field_tag 'login' %></p><p><label for="password">Password</label><br/><%= password_field_tag 'password' %></p>
<p><label for="new_password">New Password</label><br/><%= password_field_tag 'new_password' %></p><p><label for="new_password_confirmation">New Confirm Password</label><br/><%= password_field_tag 'new_password_confirmation' %></p>
<!-- Uncomment this if you want this functionality
<p><label for="remember_me">Remember me:</label><%= check_box_tag 'remember_me' %></p>
--><p><%= submit_tag 'Log in' %></p><% end -%>
(2) コントローラの修正
class AccountController < ApplicationController:
:
:
def login
return unless request.post?
return unless (params[:new_password] == params[:new_password_confirmation])
self.current_user = User.authenticate(params[:login], params[:password])
if logged_in?
if params[:remember_me] == "1"
self.current_user.remember_me
cookies[:auth_token] = { :value => self.current_user.remember_token ,
:expires => self.current_user.remember_token_expires_at }
end
flash[:notice] = "Logged in successfully"
if params[:new_password]
@user = User.find(self.current_user.id)
@user.password = params[:new_password]
@user.password_confirmation = params[:new_password_confirmation]
@user.save!
flash[:notice] = "Password changed"
end
redirect_back_or_default(:controller => '/board', :action => 'index')
end
rescue ActiveRecord::RecordInvalid
render :action => 'login'
end
:
:
:
end
(3) 動作確認
ブラウザからhttp://127.0.0.1:3000/account/loginを起動します。
1-4.アプリケーションの作成
(1) scaffoldの利用
NetBeansで[生成...]を選択
ジェネレータ(G): scaffold
モデル名(N): Address
属性ペア(フィールド型)(A): namae:string yubin:string jusho:string denwa:string
exists app/models/
exists app/controllers/
exists app/helpers/
create app/views/addresses
exists app/views/layouts/
exists test/functional/
exists test/unit/
create test/unit/helpers/
exists public/stylesheets/
create app/views/addresses/index.html.erb
create app/views/addresses/show.html.erb
create app/views/addresses/new.html.erb
create app/views/addresses/edit.html.erb
create app/views/layouts/addresses.html.erb
create public/stylesheets/scaffold.css
create app/controllers/addresses_controller.rb
create test/functional/addresses_controller_test.rb
create app/helpers/addresses_helper.rb
create test/unit/helpers/addresses_helper_test.rb
route map.resources :addresses
dependency model
exists app/models/
exists test/unit/
exists test/fixtures/
create app/models/address.rb
create test/unit/address_test.rb
create test/fixtures/addresses.yml
exists db/migrate
create db/migrate/20100204020739_create_addresses.rb
(2) マイグレーションファイルの実行
NetBeansで[データベースマイグレーション]→[現在のバージョンへ]を選択します。
(in D:/Rails_Projects/Appli004)
== CreateAddresses: migrating ================================================
-- create_table(:addresses)
-> 0.0940s
== CreateAddresses: migrated (0.0940s) =======================================
(3) 生成されたプログラムの実行
http://127.0.0.1:3000/addresses/を実行します。
1-5.ログイン機能のアプリケーションへの組み込み
認証機能のaccountプログラムとアプリケーションであるaddressプログラムをそれぞれ独立して作成しましたが、ここでそのプログラムを合体します。ほとんどのアプリケーションはこの方法で十分です。
・addressesアプリケーションのすべてのメソッドを実行する前にLoginが済んでいるかチェックを入れる
・addressesアプリケーションの終了時にLogoutメソッドを呼び出す
・Loginメソッドの実行後、addressesアプリケーションのindexメソッド(最初のメソッド)を呼び出す
・Singupメソッドの終了後はLoginメソッドを呼び出す
・Logoutメソッドの終了後はLoginメソッドを呼び出す
(1) application_controller.rbの修正
account_controler.rbの上の方に書いてある以下のコーディングを入れます。
# Filters added to this controller apply to all controllers in the application.
# Likewise, all the methods added will be available for all controllers.class ApplicationController < ActionController::Base
# Be sure to include AuthenticationSystem in Application Controller instead
include AuthenticatedSystem
# If you want "remember me" functionality, add this before_filter to Application Controller
before_filter :login_from_cookiebefore_filter :set_charset
private
def set_charset
headers['Content-Type']="text/html; charset=utf-8"
end
:
:
end
(2) account_controller.rbの修正
上の方に書いてある以下のコーディングを削ります。
class AccountController < ApplicationController
# Be sure to include AuthenticationSystem in Application Controller instead
include AuthenticatedSystem
# If you want "remember me" functionality, add this before_filter to Application Controller
before_filter :login_from_cookie# say something nice, you goof! something sweet.
def index
redirect_to(:action => 'signup') unless logged_in? || User.count > 0
end
:
:
end
(3) loginアクションの修正(戻り値の変更)
def login
return unless request.post?
self.current_user = User.authenticate(params[:login], params[:password])
if logged_in?
if params[:remember_me] == "1"
self.current_user.remember_me
cookies[:auth_token] = { :value => self.current_user.remember_token ,
:expires => self.current_user.remember_token_expires_at }
end
redirect_back_or_default(:controller => '/addresses', :action => 'index')
flash[:notice] = "Logged in successfully"
end
end
(4) signupアクションの修正(戻り値の変更)
def signup
@user = User.new(params[:user])
return unless request.post?
@user.save!
self.current_user = @user
redirect_back_or_default(:controller => '/account', :action => 'login')
flash[:notice] = "Thanks for signing up!"
rescue ActiveRecord::RecordInvalid
render :action => 'signup'
end
(5) logoutアクションの修正(戻り値の変更)
def logout
self.current_user.forget_me if logged_in?
cookies.delete :auth_token
reset_session
flash[:notice] = "You have been logged out."
redirect_back_or_default(:controller => '/account', :action => 'login')
end
(6) login事前チェックの導入
class AddressesController < ApplicationController
before_filter :login_required# GET /addresses
# GET /addresses.xml
def index
@addresses = Address.find(:all)respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @addresses }
end
end
:
:
end
(7) logoutへのリンク導入
<h1>Listing addresses</h1><table>
<tr>
<th>Namae</th>
<th>Yubin</th>
<th>Jusho</th>
<th>Denwa</th>
</tr><% for address in @addresses %>
<tr>
<td><%=h address.namae %></td>
<td><%=h address.yubin %></td>
<td><%=h address.jusho %></td>
<td><%=h address.denwa %></td><td><%= link_to 'Show', address %></td>
<td><%= link_to 'Edit', edit_address_path(address) %></td>
<td><%= link_to 'Destroy', address, :confirm => 'Are you sure?', :method => :delete %></td>
</tr><% end %>
</table>
<br /><%= link_to 'New address', new_address_path %>
<%= link_to 'Logout', {:controller => 'account', :action => 'logout'} %>
ActiveForm
ActiveRecordの機能でテーブル項目に対してvalidationを行うことはできますが、テーブルに存在しない項目に対してはvalidationを行うことができません。ActiveFormは、そのテーブルに存在しない項目に対してvalidationができるようにする機能です。
1-1.プロジェクトの生成
(1) プロジェクトAppli002を生成する
(2) 日本語環境の設定
(3) データベースの作成
1-2.Active_Formのインストール
(1) Active_Formのダウンロード
Active_Formはhttp://github.com/cs/active_formにあるので呼び出し、
をクリックして、直接cs-active_form-baa96e4.zipを適当な場所にダウンロードします。
(2) /vendor/plugins/配下にコピー
解凍したフォルダをactive_formにリネームして/vendor/plugins/配下にコピーします。
1-3.active_form.rbの修正(rails2.3以降であれば不要)
rails2.2での実行で下記のエラーになったときの対処です。rails2.3では起きません。
class ActiveForm
:
:
class <
def self_and_descendents_from_active_record
[self]
enddef human_name(*args)
name.humanize
end
:
:
end
end
1-4.アプリケーションの作成
(1) モデルの生成
NetBeansで[生成]を選択
ジェネレータ(G): model
引数(A): triangle
今回はデータベーステーブルは使用しないのでマイグレーションは実行しません。
exists app/models/
exists test/unit/
exists test/fixtures/
create app/models/triangle.rb
create test/unit/triangle_test.rb
create test/fixtures/triangles.yml
create db/migrate
create db/migrate/20100204011655_create_triangles.rb
db/migrate/20100204011655_create_triangles.rbは削除しておきましょう。
(2) モデルの修正
require 'active_form'class Triangle < ActiveForm
attr_accessor :a, :b, :c
validates_presence_of :a, :b, :c
validates_numericality_of :a, :b, :c
end
(3) コントローラとビューの生成
NetBeansで[生成]を選択
ジェネレータ(G): controller
名前(N): triangle
ビュー(V): index calculate
exists app/controllers/
exists app/helpers/
create app/views/triangle
exists test/functional/
create test/unit/helpers/
create app/controllers/triangle_controller.rb
create test/functional/triangle_controller_test.rb
create app/helpers/triangle_helper.rb
create test/unit/helpers/triangle_helper_test.rb
create app/views/triangle/index.html.erb
create app/views/triangle/calculate.html.erb
(4) 入力ブログラムの作成
<h1>三角形の面積はどのくらいか</h1>
<div id="triangle">
<%= error_messages_for :triangle %>
<% form_tag :action=>"calculate" do %>
辺a:<%= text_field :triangle, :a %><br/><br/>
辺b:<%= text_field :triangle, :b %><br/><br/>
辺c:<%= text_field :triangle, :c %><br/><br/>
<%= submit_tag "面積計算" %>
<% end %>
</div>
(5) 面積計算プログラムの作成
class TriangleController < ApplicationController
def index
enddef calculate
@triangle = Triangle.new(params[:triangle])
if @triangle.valid?
x=@triangle.a.to_f
y=@triangle.b.to_f
z=@triangle.c.to_f
fg="ON"
fg="off" if x+y<=z
fg="off" if x+z<=y
fg="off" if y+z<=xif fg=="ON" then
s=(x+y+z)/2
area=Math.sqrt(s*(s-x)*(s-y)*(s-z))
@result = "辺の長さ #{x}, #{y}, #{z} の三角形の面積は#{area}"
else
@result = "辺の長さ #{x}, #{y}, #{z} では三角形はできない"
end
else
render :action => "index"
end
end
end
(6) 結果表示のプログラム
<h1>三角形の面積</h1><%= "#{@result}" %><% form_tag :action=>"index" do %>
<%= submit_tag "戻る" %><% end %>
1-5.動作確認
(1) 正しいデータの場合
(2) 誤ったデータの場合
目次
[1]Ruby on Rails の導入
1.Rubyのインストール
1-1.Rubyのダウンロード
1-2.Rubyのインストール
2.RubyGemsのインストール
2-1.RubyGemsのダウンロード
2-2.RubyGemsのインストール
3.必要になりそうなライブラリの追加
3-1.opensslにあるDLL(暗号化ライブラリ)のダウンロード
3-2.DLLの追加
3-3.readline(文字列入力用ライブラリ)・zlib(データ圧縮展開ライブラリ)のダウンロード
3-4.DLLの追加
3-5.iconv(文字コード変換ライブラリ)のダウンロード
3-6.DLLの追加
4.Ruby on Railsのインストール
4−1.Railsのインストール
5.SQLiteのインストール
5−1.SQliteのダウンロード
5−2.SQLiteのインストール
6.データベースアダプタのインストール
6−1.データベースアダプタのインストール
7.NetBeansのインストール
7−1.JDKのダウンロード
7−2.JDKのインストール
7−3.NetBeansのダウンロード
7−4.NetBeansのインストール
[2]SQLite Manager
1.SQLite Managerのインストール
2.SQLite Managerの使用法
[3]プログラミング
1.プロジェクトの生成
1-1.プロジェクトAppli000の生成
2.日本語環境の設定
2-1.UTF-8の設定
3.データベースの作成
3-1.Rakeの利用
3-2.Rakeの選択
3-3.db:createの実行
4.テーブル保守アプリケーションの作成Scaffold
4-1.scaffoldの実行
4-2.生成されたプログラム
4-3.プロジェクトの実行
5.テーブル保守アプリケーションの改良 Paginate
5-1.プラグインwill_paginateのインストール
5-2.enviroment.rbの編集
5-3.コントローラの修正
5-4.一覧表示プログラムの修正
5-5.WEBrickを再立ち上げして実行
6.Railsの検証機能
6-1.入力時の検証機能を追加
6-2.実行
6-3.エラー表示の色の変更
6-4.実行
7.i18nによる日本語化
7-1.日本語化の準備
7-2.i18nによる生成
7-3.ラベル部分の日本語化
7-4.Paginateの日本語化
[4]ActiveForm
1.ActiveForm
1-1.プロジェクトの生成
1-2.ActiveFormのインストール
1-3.active_form.rbの修正
1-4.アプリケーションの作成
[5]認証機能
1.認証機能
1-1.プロジェクトの生成
1-2.ログイン認証プラグインacts_as_authenticatedのインストール
1-3.ログイン認証プラグインの改良
1-4.アプリケーションの作成
1-5.ログイン機能のアプリケーションへの組み込み
[6]Ajax
1.Ajax
1-1.プロジェクトの複写
1-2.画面とプログラムの流れ
1-3.プログラムの修正
[7]Activescaffold
1.ActiveScaffold
1-1.プロジェクトの生成
1-2.住所録テーブルAddressの作成
1-3.ActiveScaffoldのインストール
1-4.リソースファイルの生成
1-5.検証機能の追加
[8]テスト
1.テスト駆動開発
2.テストの手順
2-1.プログラムの仕様
2-2.プロジェクトの生成
2-3.アプリケーションの作成
2-4.テストパターンの作成
2-5.テストの実行
2-6.プログラムの修正
2-7.テストの実行
3.テストで使うメソッド
3-1.基本
3-2.テストメソッド一覧
4.テストの支援
4-1.フィクスチャ fixtures
4-2.リクエスト
5.テストモジュールのまとめ
5-1.単体テスト UNIT test
5-2.機能テスト FUNCTIONAL test
6.複数パターンのテスト
6-1.プロジェクトの生成
6-2.アプリケーションの作成
6-3.機能の追加
6-4.テストパターンの作成
6-5.テストの実行
7.Ajaxのテスト Selenium
7-1.プロジェクトの複写
7-2.Ajaxを利用するための修正
7-3.テストパターンの作成
7-4.Selenium IDEのインストール
7-5.Selenium IDEの起動
7-6.テストパターンの自動作成
7-7.主なコマンド
[9]Actionmailer
1.Actionmailer
1-1.プロジェクトの生成
1-2.テーブルpageの作成
1-3.テーブルemailの作成
1-4.テーブルattachmentの作成
1-5.リレーションの宣言
1-6.メール受信専用モデルの作成
1-7.動作確認
1-8.メール送信サーバの設定
1-9.メール送信専用モデルの作成
1-10.コントローラrmailerの作成
1-11.ビューの作成
1-12.スタイルシートの作成
1-13.レイアウトファイルの作成
1-14.動作確認
[10]Activeresource
1.Activeresource
1-1.ActiveResourceの特徴
2.バックエンドとなるアプリケーションの作成
2-1.プロジェクトの生成
2-2.テーブル保守プログラムの作成
3.フロントエンドとなるアプリケーションの作成
3-1.プロジェクトの生成
3-2.テーブル保守プログラムの作成
4.動作確認
[11]FileColumn
1.FileColumn
1-1.プロジェクトの生成
1-2.file_columnのインストール
1-3.アプリケーションの作成
[12]ファイルのアップロードとダウンロード
1.ファイルのアップロードとダウンロード
1-1.プロジェクトの生成
1-2.モデルの作成
1-3.コントローラの作成
1-4.ビューの編集
1-5.ファイル格納先の作成
1-6.動作確認
1-7.表示の改善
[13]ProtoThickBox
1.ProtoThickBox
1-1.プロジェクトの生成
1-2.protothickboxのインストール
1-3.モデルの作成
1-4.コントローラの作成
1-5.ビューの編集
1-6.ファイル格納先の作成
1-7.動作確認
1-8.thickboxへの対応
1-9.動作確認
[14]ディレクトリとファイルの操作
1.ディレクトリとファイルの操作
1-1.文字コード変換
1-2.バックスラッシュ記法
1-3.カレントディレクトリ
1-4.プロジェクトの生成
1-5.ディレクトリ操作のプログラム作成
1-6.動作確認
1-7.ファイル操作のプログラム作成
1-8.動作確認
[15]Open Flash Chart
1.Open Flash Chart
1-1.プロジェクトの生成
1-2.Open Flash Chartのインストール
1-3.アプリケーションの作成
1-4.ルーティングの設定
1-5.棒グラフ
1-6.折れ線グラフ
1-7.円グラフ
1-8.横棒グラフ
1-9.データの登録
1-10.折れ線グラフによる売上推移表の作成
1-11.棒グラフによる売上前年比較表の作成
2.Open Flash Chart 2の文法
2-1.JSON
[16]REXML
1.REXML
1-1.プロジェクトの生成
1-2.xmlファイルの作成
1-3.アプリケーションの作成
1-4.さまざまな機能
以下今後の予定です
[17]Google Map API
1.Google Map API
1-1.APIキーの取得
1-2.地図の表示
1-3.経度と緯度の取得
1-4.ルートの表示
2.ym4r-gm
2-1.プロジェクトの生成
2-2.ym4r-gmのインストール
2-3.アプリケーションの作成
2-4.動作確認
3.GeoKit
3-1.プロジェクトの複写
3-2.geokitのインストール
3-3.アプリケーションの作成
2-4.動作確認
i18nによる日本語化
7.i18nによる日本語化
Rails2.2から様々な言語に対応できるように、国際化i18n(internationalizationの頭と後ろのiとn、文字数が18文字)が標準で搭載されました。
この機能によりラベル名やエラーメッセージなどの日本語化が簡単にできるようになります。
提供されたプログラムを特定の言語に対応させることを地域化L10N(localization)といい、Railsでもいままで様々な地域化の試みが行われてきていましたが、これはその集大成に位置するものと考えると分かりやすいかもしれません。
引き続いてプロジェクトAppli000を使って日本語化を説明します。
7-1.日本語化の準備
(1) amatsuda-i18nのインストール
C:\Ruby>gem sources -a http://gems.github.com
http://gems.gethub.com added to sourcesC:\Ruby>gem install amatsuda-i18n_generators
Successfully installed locale-2.0.5
Successfully installed gettext-2.0.5
Successfully installed amatsuda-i18n_generators-0.6.0
3 gem installed
Installing ri documentation for locale-2.0.5...
Installing ri documentation for gettext-2.0.5...
Installing RDoc documentation for locale-2.0.5...
Installing RDoc documentation for gettext-2.0.5...
7-2.i18nによる生成
(1) 日本語のリソースファイルの生成
対象とするプロジェクトにディレクトリを移してから実行します。
D:\Rails_Projects\Appli000>ruby script/generate i18n ja
debug updating environment.rb ...
debug fetching ja.yml fro rails-i18n repository...
exists config/locales
update config/environment.rb
create config/locales/ja.yml
debug 1 models found.
debug 0 translating activerecord.models.address ...
debug translating activerecord.attributes.address.namae ...
debug translating activerecord.attributes.address.yubin ...
debug translating activerecord.attributes.address.jusho ...
debug translating activerecord.attributes.address.denwa ...
debug took 1.172 secs to translate.
create config/locales/translation_ja.yml
(2) jp.ymlの内容確認
ja.ymlのソースを確認してください。どのように日本語変換されるかよく分かります。
# Japanese translations for Ruby on Rails
# by Akira Matsuda (ronnie@dio.jp)
# AR error messages are basically taken from Ruby-GetText-Package. Thanks to Masao Mutoh.ja:
date:
formats:
default: "%Y/%m/%d"
short: "%m/%d"
long: "%Y年%m月%d日(%a)"day_names: [日曜日, 月曜日, 火曜日, 水曜日, 木曜日, 金曜日, 土曜日]
abbr_day_names: [日, 月, 火, 水, 木, 金, 土]
:
:
activerecord:
errors:
template:
header:
one: "{{model}}にエラーが発生しました。"
other: "{{model}}に{{count}}つのエラーが発生しました。"
body: "次の項目を確認してください。"messages:
inclusion: "は一覧にありません。"
exclusion: "は予約されています。"
invalid: "は不正な値です。"
confirmation: "が一致しません。"
accepted: "を受諾してください。"
empty: "を入力してください。"
blank: "を入力してください。"
too_long: "は{{count}}文字以内で入力してください。"
too_short: "は{{count}}文字以上で入力してください。"
wrong_length: "は{{count}}文字で入力してください。"
taken: "はすでに存在します。"
not_a_number: "は数値で入力してください。"
greater_than: "は{{count}}より大きい値にしてください。"
greater_than_or_equal_to: "は{{count}}以上の値にしてください。"
equal_to: "は{{count}}にしてください。"
less_than: "は{{count}}より小さい値にしてください。"
less_than_or_equal_to: "は{{count}}以下の値にしてください。"
odd: "は奇数にしてください。"
even: "は偶数にしてください。"
record_invalid: "バリデーションに失敗しました。 {{errors}}"full_messages:
format: "{{attribute}}{{message}}"
(3) 動作確認
WEBrickを再立ち上げして実行します。
エラーメッセージが日本語になりました。
(4) translation_ja.ymlの更新
メッセージは日本語化されましたが、メッセージの中のテーブル名や項目名はひらがなや英字です。
これはtranslation_ja.ymlを修正することで解決します。
ja:
activerecord:
models:
address: "住所" #g
address: "住所録"attributes:
address:
namae: "なまえ" #g
yubin: "ゆうびん" #g
jusho: "Jusho" #g
denwa: "でんわ" #g
namae: "名前"
yubin: "郵便番号"
jusho: "住所"
denwa: "電話"
7-3.ラベル部分の日本語化
(1) translation_ja.ymlの修正
いまはタイトルやラベルは英字のままです。ここも日本語化しましょう。
translation_ja.ymlに変換コードを追加することで日本語化できます。
ja:
activerecord:
models:
address: 住所録
attributes:
address:
namae: 名前
yubin: 郵便
jusho: 住所
denwa: 電話
label:
Editing_address: 住所録の更新
Listing_addresses: 住所録一覧
New_address: 住所録への新規登録
Namae: 名前
Yubin: 郵便
Jusho: 住所
Denwa: 電話
Are_you_sure?: 削除してよろしいですか?
link:
New_address: 追加
Show: 表示
Edit: 編集
Destroy: 削除
Back: 前画面
button:
Create: 新規登録実行
Update: 更新実行
(2) ビューのプログラム修正
app/views/addresses/edit.html.erb
app/views/addresses/index.html.erb
app/views/addresses/new.html.erb
app/views/addresses/show.html.erb
該当箇所を<%= t(label.Namae) %>と記述することで"名前"となります。
<br/>
<h1><%= t('label.Listing_addresses') %></h1><table>
<tr>
<th><%= t('label.Namae') %></th>
<th><%= t('label.Yubin') %></th>
<th><%= t('label.Jusho') %></th>
<th><%= t('label.Denwa') %></th>
</tr><% for address in @addresses %>
<tr>
<td><%=h address.namae %></td>
<td><%=h address.yubin %></td>
<td><%=h address.jusho %></td>
<td><%=h address.denwa %></td>
<td><%= link_to t('link.Show'), address %></td>
<td><%= link_to t('link.Edit'), edit_address_path(address) %></td>
<td>>%= link_to t('link.Destroy'), address,
:confirm => t('label.Are_you_sure?'), :method => :delete %></td>
</tr><% end %>
</table><div class="pagination_link">
<%= will_paginate @addresses %>
</div><br /><%= link_to t('link.New_address'), new_address_path %>
(3) Webブラウザで確認
(indexの画面)
(Newの画面)
7-4.Paginateの日本語化
(1) index.html.erbの修正
indexの画面を見るとPaginateの部分だけが日本語化されていません。
これを日本語化するにはwill-paginateの指定部分でオプションを付けることで解決します。
<br/>
<h1><%= t('label.Listing_addresses') %></h1><table>
<tr>
<th><%= t('label.Namae') %></th>
<th><%= t('label.Yubin') %></th>
<th><%= t('label.Jusho') %></th>
<th><%= t('label.Denwa') %></th>
</tr><% for address in @addresses %>
<tr>
<td><%=h address.namae %></td>
<td><%=h address.yubin %></td>
<td><%=h address.jusho %></td>
<td><%=h address.denwa %></td>
<td><%= link_to t('link.Show'), address %></td>
<td><%= link_to t('link.Edit'), edit_address_path(address) %></td>
<td>>%= link_to t('link.Destroy'), address,
:confirm => t('label.Are_you_sure?'), :method => :delete %></td>
</tr><% end %>
</table><div class="pagination_link">
<%= will_paginate @addresses, :prev_label => "« 前", :next_label => "次 »" %>
</div><br /><%= link_to t('link.New_address'), new_address_path %>
(2) ブラウザによる動作確認
paginateの部分も日本語化されました。
(3) Paginateのスタイルシート
paginateにスタイルシートを適用すると、いろいろな形式の表示が可能となります。
ここでは一例として、will_paginate.cssを使ったサンプルを示します。
/* スタイルシート: public/stylesheets/will_paginate.css */
.pagination {
padding: 3px;
margin: 3px;
}
.pagination a {
padding: 2px 5px 2px 5px;
margin: 2px;
border: 1px solid #aaaadd; /* ノーマルどきの枠の色 default: #aaaadd */
text-decoration: none;
color: #009900; /* ノーマルどきの文字の色 default: #000099 */
}
.pagination a:hover, .pagination a:active {
border: 1px solid #009900; /* カーソルが乗ったときの枠の色 default: #000099 */
color: #fff; /* カーソルが乗ったときの文字の色 default: #000 */
}
.pagination span.current {
padding: 2px 5px 2px 5px;
margin: 2px;
border: 1px solid #009900; /* カレントの枠の色 default: #000099 */
font-weight: bold;
background-color: #009900; /* カレントの背景色 default: #000099 */
color: #FFF; /* カレントの文字の色 default: #FFF */
}
.pagination span.disabled {
padding: 2px 5px 2px 5px;
margin: 2px;
border: 1px solid #eee; /* 範囲外の枠の色 default: #eee */
color: #ddd; /* 範囲外の文字の色 default: #ddd */
}
(4) スタイルシートの読み込み
作成したスタイルシートを読み込む処理をプログラムに組み入れます。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
<title>Addresses: <%= controller.action_name %></title>
<%= stylesheet_link_tag 'scaffold', 'will_paginate' %>
</head>
<body><p style="color: green"><%= flash[:notice] %></p><%= yield %>
</body>
</html>
(5) ブラウザによる動作確認
WEBrickを再起動して実行します。
Railsの検証機能 Vaidation
6.Railsの検証機能
入力項目に対し桁数チェックであるとか、ニューメリックチェックであるとか様々なチェックを行うことが多いですが、Railsにはこれらの検証機能としてvaildationが用意されています。
プロジェクトAppli000を例として取り上げ検証機能を付加してみましょう。
6-1.入力時の検証機能を追加
それぞれの項目に対し様々な検証機能を対象モデルに付加します。
class Address < ActiveRecord::Base
validates_presence_of :namae
validates_uniqueness_of :namae
validates_length_of :namae, :maximum => 12
validates_presence_of :yubin
validates_length_of :yubin, :within => 3..8
validates_presence_of :jusho
validates_presence_of :denwa
validates_format_of :denwa, :with => /\d{2}-\d{4}-\d{4}|\d{3}-\d{3}-\d{4}|\d{4}-\d{2}-\d{4}/
end
個々の意味はつぎの通りです。
■ validates_presence_of :namae, :yubin, jusho, denwa
指定されたフィールドは必須項目。未入力ならエラー。
検証フィールド名は、カンマで区切って複数指定できる。
■ validates_uniqueness_of :namae
データベースのテーブルのnamaeフィールドの値と重複していなければOK。重複していたらエラー。
■ validates_length_of :namae, :maximum => 12
最大12文字までOK。12文字を超えたらエラー。
■ validates_length_of :yubin, :within => 3..8
3文字から8文字までOK。それ以外はエラー。
■ validates_numericality_of :kakaku
数値の入力であればOK。数値に変換できない文字列はエラー。
■ validates_format_of :denwa, :with => /\d{3}-\d{3}-\d{4}|\d{4}-\d{2}-\d{4}/
数字3桁−数字3桁−数字4桁または数字4桁−数字2桁−数字4桁ならOK。異なっていればエラー。
正規表現を利用すれば、相当広範囲なことが検証可能になる。
このほかにも様々な検証が用意されていますが、実用的なものを紹介します。
■ validates_confirmation_of :password
入力確認用のチェックフィールドで、_confirmation というアクセサが自動生成される。
■ validates_format_of :email, :with => /[^@]+@[^@\.]+\.[^@\.]+/
メールアドレスのチェック。
■ validates_exclusion_of :password :in => /^\d+$/, :message => '数字のみは危険'
指定された値の範囲外はエラー。メッセージを表示する。
「^\d+$」とは最初から数字が続いて最後までという正規表現。
6-2.実行
すべてのフィールドを空白のまま新規登録してみましょう。
入力項目の内容がチェックされ、該当するエラーメッセージが表示されます。
6-3.エラー表示の色の変更
標準では赤色でエラーの箇所が表示されますが、アプリケーションによっては他の色に変えたいことがあるかもしれません。このような場合はscaffoldのスタイルシートを変更します。
body { background-color: #fff; color: #333; }body, p, ol, ul, td {
font-family: verdana, arial, helvetica, sans-serif;
font-size: 13px;
line-height: 18px;
}pre {
background-color: #eee;
padding: 10px;
font-size: 11px;
}a { color: #000; }
a:visited { color: #666; }
a:hover { color: #fff; background-color:#000; }.fieldWithErrors {
padding: 2px;
background-color: #87CEEB; /* (1)エラーしたフィールドの背景色 default: red */
display: table;
}#errorExplanation {
width: 400px;
border: 2px solid #87CEEB; /* (2)エラーメッセージのボックスの線の色default: red */
padding: 7px;
padding-bottom: 12px;
margin-bottom: 20px;
background-color: #f0f0f0; /* (3)エラーメッセージのボックス内の背景色default: #f0f0f0 */
}#errorExplanation h2 {
text-align: left;
font-weight: bold;
padding: 5px 5px 5px 15px;
font-size: 12px;
margin: -7px;
background-color: #87CEEB; /* (4)エラーメッセージのタイトル行の背景色default: #c00 */
color: #000000; /* (5)エラーメッセージのタイトル行の文字色default: #fff */
}#errorExplanation p {
color: #333;
margin-bottom: 0;
padding: 5px;
}#errorExplanation ul li {
font-size: 12px;
list-style: square;
}
テーブル保守アプリケーションの改良(Paginateの利用)
5.テーブル保守アプリケーションの改良 Paginate
レコードが数件のうちはScaffoldの機能だけで十分ですが、1,000件とかになるとメモリーの不足や転送速度の低下が発生し実用的でなくなってしまいます。そこで一定レコード毎に区切って表示をする方法を導入します。この機能を使うにはPaginateというパッケージが必要となります。
5-1.プラグインwill_paginateのインストール
c:\Ruby>gem sources -a http://gems.github.com
http://gems.github.com added to sourcesc:\Ruby>gem install mislav-will_paginate
Successfully installed mislav-will_paginate-2.3.11
1 gem installed
Installing ri documentation for mislav-will_paginate-2.3.11...
Installing RDoc documentation for mislav-will_paginate-2.3.11...
5-2.enviroment.rbの編集
最後尾(endのあと)に追加します。
gem "mislav-will_paginate", "2.3.11"
require "will_paginate"
# Be sure to restart your server when you modify this file
$KCODE = 'u'# Uncomment below to force Rails into production mode when
# you don't control web/app server and can't set it the proper way
# ENV['RAILS_ENV'] ||= 'production'# Specifies gem version of Rails to use when vendor/rails is not present
RAILS_GEM_VERSION = '2.2.2' unless defined? RAILS_GEM_VERSION# Bootstrap the Rails environment, frameworks, and default configuration
require File.join(File.dirname(__FILE__), 'boot')Rails::Initializer.run do |config|
:
:
endgem "mislav-will_paginate", "2.3.11"
require "will_paginate"
5-3.一覧表示プログラムの修正
addresses_controller.rbのindexメソッドを修正します。
class AddressesController < ApplicationController
# GET /addresses
# GET /addresses.xml
def index
@addresses = Address.find(:all)
@addresses = Address.paginate :page => params[:page],
:order => 'created_at DESC',
:per_page => 15respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @addresses }
end
end
:
:
end
5-4.一覧表示プログラムの修正
index.html.erbにpagnateを追加します。
<h1>Listing addresses</h1><table>
<tr>
<th>Namae</th>
<th>Yubin</th>
<th>Jusho</th>
<th>Denwa</th>
</tr><% for address in @addresses %>
<tr>
<td><%=h address.namae %></td>
<td><%=h address.yubin %></td>
<td><%=h address.jusho %></td>
<td><%=h address.denwa %></td>
<td><%= link_to 'Show', address %></td>
<td><%= link_to 'Edit', edit_address_path(address) %></td>
<td><%= link_to 'Destroy', address, :confirm => 'Are you sure?', :method => :delete %></td>
</tr><% end %>
</table><div class="pagination_link">
<%= will_paginate @addresses %>
</div><br /><%= link_to 'New address', new_address_path %>
5-5.WEBrickを再立ち上げして実行
テーブル保守アプリケーションの作成(Scaffoldの利用)
4.テーブル保守アプリケーションの作成 Scaffold
Railsには一発でテーブルアプリケーションを生成してしまうScaffold機能を内蔵しています。それを利用してアプリケーションを作成してみましょう。scaffoldスキャフォールドとはデータベースを利用する「足場」という意味から付けられました。
4-1.scaffoldの実行
NetBeansで生成を選択
ジェネレータ(G): scaffold
モデル名(M): Address
属性ペア(フィールド型)(A):namae:string yubin:string jusho:string denwa:string
exists app/models/
exists app/controllers/
exists app/helpers/
create app/views/addresses
exists app/views/layouts/
exists test/functional/
exists test/unit/
create test/unit/helpers/
exists public/stylesheets/
create app/views/addresses/index.html.erb
create app/views/addresses/show.html.erb
create app/views/addresses/new.html.erb
create app/views/addresses/edit.html.erb
create app/views/layouts/addresses.html.erb
create public/stylesheets/scaffold.css
create app/controllers/addresses_controller.rb
create test/functional/addresses_controller_test.rb
create app/helpers/addresses_helper.rb
create test/unit/helpers/addresses_helper_test.rb
route map.resources :addresses
dependency model
exists app/models/
exists test/unit/
exists test/fixtures/
identical app/models/address.rb
identical test/unit/address_test.rb
skip test/fixtures/addresses.yml
exists db/migrate
Another migration is already named create_addresses: b/migrate/20100128085029_create_addresses.rb
4-2.生成されたプログラム
生成された主なプログラムは次の通りです。
/app/controllers/addresses_controller.rb
/app/views/addresses/index.html.erb
/app/views/addresses/show.html.erb
/app/views/addresses/new.html.erb
/app/views/addresses/edit.html.erb
4-3.プロジェクトの実行
(1) 開発用WebサーバWEBrickの立ち上げ
NetBeansで実行を選択
=> Booting Mongrel
=> Rails 2.3.5 application starting on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
サーバー側のブラウザにプロジェクトのトップページが表示されます。
(2) プロジェクトの起動
ネットワーク上のWebブラウザからhttp://127.0.0.1:3000/addresses/を入力します。
表示コマンド | 内容 |
---|---|
New | 新規レコードの追加 |
List | 一覧表示 |
Show | 1レコードの内容表示 |
Edit | 1レコードの編集 |
Destroy | 1レコードの削除 |