スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Ruby on Rails 3 アプリケーションプログラミング

なんとなく AmazonRails 関連の本を見てたら、
こんなのが 5/12 に発売されるらしい↓




Ruby on Rails 3 について書かれた本はおそらく初めてじゃないかと思う。

Amazon の紹介文によれば、
HTML5 対応、jQuery 等のプラグインと拡張機能など、
初心者から中上級者までをカバーした実践的なWebアプリケーション開発手法を解説します。とのこと。

まだまだ勉強不足なところもあるし、良さそうだったら買ってみようかな~。

I18n を使った多言語対応①

多言語対応について。

ひとつの言語でサイトを作る場合は特に気にしなくてもよいが、
様々な言語に対応するサイトを構築するときに便利なのが I18n モジュールである。

まず適当にプロジェクトを作成し、scaffoldでuserモデルを作成。
$ rails new localization
$ cd localization
$ rails g scaffold user name:string

テーブルを作成し実行する。
$ rake db:migrate
$rails s

実行して適当にuserを追加しindexページにアクセスすると、
「Name」というテキストの下にuserの一覧表が出来上がる。

ここで生成されたファイルを見てみる。
config/localsフォルダの中にen.ymlというファイルが作られている。
実はこれがローケルファイルであり、I18nモジュールを使用する際に参照するファイルである。
これを以下のように編集する。
en:
name: "User's name are"


次に、このローケルファイルを参照するために、config/initializersにi18n.rbというファイルを追加し、
以下のように記述する。
I18n.default_locale = 'en'
LOCALES_DIRECTORY = "#{Rails.root}/config/locales/"

ここではI18nモジュールを使用しデフォルトの言語を1行目で設定し、
2行目で参照するローケルファイルのあるディレクトリを指定している。

最後に、app/views/users/index.html.erbを以下のように編集する。
<h1>Listing users</h1>

<table>
<tr>
<th><%= I18n.t('name') %></th>
</tr>

<% @users.each do |user| %>
<tr>
<td><%= user.name %></td>
<td><%= link_to 'Show', user %></td>
<td><%= link_to 'Edit', edit_user_path(user) %></td>
<td><%= link_to 'Destroy', user, :confirm => 'Are you sure?', :method => :delete %></td>
</tr>
<% end %>
</table>

<br />

<%= link_to 'New User', new_user_path %>

すると、「Name」の部分が「User's name are」となって表示される。

このようにしてI18nモジュールを使用することができる。

これを応用すると多言語対応されたアプリケーションができるってわけ。
具体的なやり方はまた次の機会に書こうと思う。

Rails3 ルーティング ( 基本 )

前回に引き続きルートの話。
今回は基本となるmacthディレクティブについて。
前回のtest_routeプロジェクトを使って説明していく。前回の記事についてはこちら

さて、test_routeプロジェクトを作成直後のルートはこうなっていた。
$ rake routes
(in /Users/yas/NetBeansProjects/test_route)
routes GET /routes(.:format) {:action=>"index", :controller=>"routes"}
POST /routes(.:format) {:action=>"create", :controller=>"routes"}
new_route GET /routes/new(.:format) {:action=>"new", :controller=>"routes"}
edit_route GET /routes/:id/edit(.:format) {:action=>"edit", :controller=>"routes"}
route GET /routes/:id(.:format) {:action=>"show", :controller=>"routes"}
PUT /routes/:id(.:format) {:action=>"update", :controller=>"routes"}
DELETE /routes/:id(.:format) {:action=>"destroy", :controller=>"routes"}


前回はresourcesディレクティブを使ってRESTfulルートの追加を行っていたが、
実際は新しいアクションを追加するタイミングでルートの追加を行うことが多いと思う。
この時使うのが、基本となるmatchディレクティブである。

例えば、routesコントローラに:checkというアクションを追加した場合、
:idを含んだURLに対応したルートを追加するためには以下のようにする。(config/routes.rb)
match 'routes/:id/check', :to => 'routes#check'

なお、:toを省略して以下のようにも書ける。
match 'routes/:id/check' => 'routes#check'

追加後のルートを確認。
$ rake routes
(in /Users/yas/NetBeansProjects/test_route)
routes GET /routes(.:format) {:action=>"index", :controller=>"routes"}
POST /routes(.:format) {:action=>"create", :controller=>"routes"}
new_route GET /routes/new(.:format) {:action=>"new", :controller=>"routes"}
edit_route GET /routes/:id/edit(.:format) {:action=>"edit", :controller=>"routes"}
route GET /routes/:id(.:format) {:action=>"show", :controller=>"routes"}
PUT /routes/:id(.:format) {:action=>"update", :controller=>"routes"}
DELETE /routes/:id(.:format) {:action=>"destroy", :controller=>"routes"}
/routes/:id/check(.:format) {:controller=>"routes", :action=>"check"}

ルートが追加されているのが確認できる。

しかし、追加したルートにはHTTPメソッドが指定されていない。
GETに指定したい場合以下のようにする。
match 'routes/:id/check' => 'routes#check', :via => 'get'

再度ルートの確認。
$ rake routes
(in /Users/yas/NetBeansProjects/test_route)
routes GET /routes(.:format) {:action=>"index", :controller=>"routes"}
POST /routes(.:format) {:action=>"create", :controller=>"routes"}
new_route GET /routes/new(.:format) {:action=>"new", :controller=>"routes"}
edit_route GET /routes/:id/edit(.:format) {:action=>"edit", :controller=>"routes"}
route GET /routes/:id(.:format) {:action=>"show", :controller=>"routes"}
PUT /routes/:id(.:format) {:action=>"update", :controller=>"routes"}
DELETE /routes/:id(.:format) {:action=>"destroy", :controller=>"routes"}
GET /routes/:id/check(.:format) {:controller=>"routes", :action=>"check"}

GETメソッドであることが指定された。

最後に、ルートに名前をつけたい場合は以下のようにする。
match 'routes/:id/check' => 'routes#check', :via => 'get', :as => 'check_route'

$ rake routes
(in /Users/yas/NetBeansProjects/test_route)
routes GET /routes(.:format) {:action=>"index", :controller=>"routes"}
POST /routes(.:format) {:action=>"create", :controller=>"routes"}
new_route GET /routes/new(.:format) {:action=>"new", :controller=>"routes"}
edit_route GET /routes/:id/edit(.:format) {:action=>"edit", :controller=>"routes"}
route GET /routes/:id(.:format) {:action=>"show", :controller=>"routes"}
PUT /routes/:id(.:format) {:action=>"update", :controller=>"routes"}
DELETE /routes/:id(.:format) {:action=>"destroy", :controller=>"routes"}
check_route GET /routes/:id/check(.:format) {:controller=>"routes", :action=>"check"}


このようにして、macthディレクティブを使ったルートの追加ができる。


Rails3 ルーティング ( resources )

Rails3で仕様が変わったルーティングについてメモ程度に書いておく。
今回はRailsの定番、resourcesディレクティブについて。

まずはプロジェクトを作成。
$ rails new test_route
$ cd test_route

ルーティングの確認のためscaffoldを使って適当にアプリケーションを作る。
$ rails g scaffold Route test:string


現在のルーティングを確認する。
$ rake routes
(in /Users/yas/NetBeansProjects/test_route)
routes GET /routes(.:format) {:action=>"index", :controller=>"routes"}
POST /routes(.:format) {:action=>"create", :controller=>"routes"}
new_route GET /routes/new(.:format) {:action=>"new", :controller=>"routes"}
edit_route GET /routes/:id/edit(.:format) {:action=>"edit", :controller=>"routes"}
route GET /routes/:id(.:format) {:action=>"show", :controller=>"routes"}
PUT /routes/:id(.:format) {:action=>"update", :controller=>"routes"}
DELETE /routes/:id(.:format) {:action=>"destroy", :controller=>"routes"}


この時のソースを確認。
config/routes.rbを見てみると、たった一行の記述であることがわかる。
resources :routes
これはresourcesディレクティブであり、
上記のようにRESTfulルートと呼ばれる一連のルートを生成する。これによりアプリケーションは標準的なCRUD操作にアクセスできるのである。

試しにconfig/routes.rbに以下を追加してみる。
resources :routes
resources :tests

ルートの確認をすると、以下のようになる。
$ rake routes
(in /Users/yas/NetBeansProjects/test_route)
routes GET /routes(.:format) {:action=>"index", :controller=>"routes"}
POST /routes(.:format) {:action=>"create", :controller=>"routes"}
new_route GET /routes/new(.:format) {:action=>"new", :controller=>"routes"}
edit_route GET /routes/:id/edit(.:format) {:action=>"edit", :controller=>"routes"}
route GET /routes/:id(.:format) {:action=>"show", :controller=>"routes"}
PUT /routes/:id(.:format) {:action=>"update", :controller=>"routes"}
DELETE /routes/:id(.:format) {:action=>"destroy", :controller=>"routes"}
tests GET /tests(.:format) {:action=>"index", :controller=>"tests"}
POST /tests(.:format) {:action=>"create", :controller=>"tests"}
new_test GET /tests/new(.:format) {:action=>"new", :controller=>"tests"}
edit_test GET /tests/:id/edit(.:format) {:action=>"edit", :controller=>"tests"}
test GET /tests/:id(.:format) {:action=>"show", :controller=>"tests"}
PUT /tests/:id(.:format) {:action=>"update", :controller=>"tests"}
DELETE /tests/:id(.:format) {:action=>"destroy", :controller=>"tests"}


もちろんこのままではコントローラーが無いためアプリケーションとしては動作はしないが、
ルートの追加が簡単にできるので便利。

ちなみに、上の例はこのように書いても良い。
resources :routes, :tests

また、CRUD操作のうち生成するルートの制限を加えることも可能で、
その場合は:only:exceptといったオプションを使う。
例えば、showのみルート生成したい場合は、
resources :tests, :only => 'show'
のようにすると、以下のようにshowのルートのみが生成される。
$ rake routes
(in /Users/yas/NetBeansProjects/test_route)
routes GET /routes(.:format) {:action=>"index", :controller=>"routes"}
POST /routes(.:format) {:action=>"create", :controller=>"routes"}
new_route GET /routes/new(.:format) {:action=>"new", :controller=>"routes"}
edit_route GET /routes/:id/edit(.:format) {:action=>"edit", :controller=>"routes"}
route GET /routes/:id(.:format) {:action=>"show", :controller=>"routes"}
PUT /routes/:id(.:format) {:action=>"update", :controller=>"routes"}
DELETE /routes/:id(.:format) {:action=>"destroy", :controller=>"routes"}
test GET /tests/:id(.:format) {:action=>"show", :controller=>"tests"}
こんな感じ。


フェイスブック 若き天才の野望 (5億人をつなぐソーシャルネットワークはこう生まれた)


file_column プラグインの使い方

今回は画像アップロードのためのプラグイン。file_columnの使い方について。
最近ではPaperclipというプラグインもあるらしいが、とりあえずこちらを使うことにした。

まずは普通にrailsプロジェクトを作成し、ディレクトリの中に移動。
$ rails new test_f_column
$ cd new test_f_column

そして、file_columnプラグインのインストール。github経由で行う。
$ rails plugin install git://github.com/tekin/file_column.git

このfile_columnを使用するためにはRmagickが必要になる。
このためGemfileに以下を記述し、bundle installする。
gem 'rmagick', :require => 'RMagick'

bundle install


scaffoldで簡単にテストしてみる。
$ rails g scaffold Photo title:string image:string
$ rake db:migrate


モデル(app/models/photo.rb)に画像のパスを格納する列を追加。
class Photo < ActiveRecord::Base
file_column :image, :magick => {
:versions => {
:thumb => "50x50",
:middle => "100x100",
:large => "400x400"
}
}
end
画像を保存するパスを変更したい場合は、
class Photo < ActiveRecord::Base
file_column :image,
:root_path => "#{Rails.root}/public/album",
:web_root => "album/",

:magick => {
:versions => {
:thumb => "50x50",
:middle => "100x100",
:large => "400x400"
}
}
end
のようにする。
次にビューの変更をする。(app/views/photos/_form.html.erb)
<%= form_for(@photo, :html => { :multipart => true }) do |f| %>
<% if @photo.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@photo.errors.count, "error") %> prohibited this entry from being saved:</h2>

<ul>
<% @photo.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>

<div class="field">
<%= f.label :title %><br />
<%= f.text_field :title %>
</div>
<div class="field">
<%= f.label :image %><br />
<%= file_column_field "photo", "image" %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
以上のようにmultipartにする必要があるみたい。
続いて、show.html.erbを変更。
<p id="notice"><%= notice %></p>

<p>
<b>Title:</b>
<%= @photo.title %>
</p>

<p>
<b>Image:</b>
<%= image_tag(url_for_image_column(@photo, "image", :middle)) if @photo.image %>
</p>


<%= link_to 'Edit', edit_photo_path(@photo) %> |
<%= link_to 'Back', photos_path %>


最後に確認してみる。
$ rails s


どうやらきちんと動作しているっぽい。
とりあえず簡単な画像アップロードならこれで十分だと思う。
気が向いたらPaperclipも使ってみようかな。。。

WEB DB PRESS Vol.60

新品価格
¥1,554から
(2011/2/21 22:39時点)



検索フォーム
プロフィール

yas

Author:yas
yasと申します。
RailsにてWebアプリケーション開発をしております。

【開発環境】
OS: Mac OSX 10.6
Ruby: 1.9
Rails: 3.0
IDE: NetBeans6.9

最新記事
カテゴリ
月別アーカイブ
RSSリンクの表示
リンク
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。