BookmarkOnInstantRails からの続き:
scaffold(足場)で何ができるか試してみよう。
http://localhost:3000/item/を開くと次画面がでる。

ここで、「New item」のリンクをたどって登録フォームが現れるの適当な値をいれてCreateボタンをクリックする。
すると、次のように一覧が見られる。内容を見たり、修正したり、削除もできる。
基本的な機能を持つWEBアプリが一行でできてしまった。 これはすごい。

日本語の設定
上の画面でも一応、日本語は表示されているが、生成されるHTMLを見てみると漢字コードに関する記述がない。
このままだと文字化けすることもありえるので、日本語が確実に使えるように設定する。
C:\Ruby\InstantRails?\rails_apps\bookmark\config\environment.rbをメモ帳で開き、2行目にutf-8のコードを使うと宣言する。
uと一文字なのは、一文字しか見ないためらしい。
# Be sure to restart your web server when you modify this file.
$KCODE=u
次にHTTPヘッダに文字コードUTF-8が出るようにする。
C:\Ruby\InstantRails?\rails_apps\bookmark\app\controllers\application.rbをメモ帳で開き、次の内容に変更する。
class ApplicationController < ActionController::Base before_filter :set_charsetprotected def set_charset @headers["Content-Type"] = "text/html; charset=utf-8" end end
これで、UTF-8を使って日本語を正しく表示できるようになったはず。
ソースコードもUTF-8で書くことになるので、Windowsのメモ帳は使えくなる。
UTF-8対応のエディタとして、私はTeraPad
2005年12月18日 10:16分 悩んでます
ここまで書いて、Instant Railsを再起動して生成されるHTMLを見たが、uft-8の記述が入っていなかった。なぜ?
scaffoldでは何をやっているか
scaffoldは便利ですが、何をやっているのかさっぱり分かりませんし、変更することもできない。
そこで、scaffoldをジェネレータとして動かして、処理内容を自動生成させ、それに手を加えることにする。
もし、DOSボックスが開いていなければ、IマークからRailsApplication?-Open Ruby Console Windowを選ぶ。
そこに次に様に打ち込む。途中2回ほど上書きするか聞いてくるので、Yと答える。
C:\Ruby\InstantRails\rails_apps>cd bookmarkC:\Ruby\InstantRails\rails_apps\bookmark>ruby script/generate scaffold Item Item exists app/controllers/ exists app/helpers/ exists app/views/item exists test/functional/ dependency model exists app/models/ exists test/unit/ exists test/fixtures/ identical app/models/item.rb identical test/unit/item_test.rb identical test/fixtures/items.yml create app/views/item/_form.rhtml create app/views/item/list.rhtml create app/views/item/show.rhtml create app/views/item/new.rhtml create app/views/item/edit.rhtml overwrite app/controllers/item_controller.rb? [Ynaq]Y force app/controllers/item_controller.rb overwrite test/functional/item_controller_test.rb? [Ynaq] Y force test/functional/item_controller_test.rb identical app/helpers/item_helper.rb create app/views/layouts/item.rhtml create public/stylesheets/scaffold.css
C:\Ruby\InstantRails\rails_apps\bookmark>
できあがったコントローラ(C:\Ruby\InstantRails?\rails_apps\bookmark\app\controllers\item_controller.rbは次のようになっている。
Rubyを知らない私でも何となく意味は分かるような気がする。
class ItemController < ApplicationController
def index
list
render :action => list
end def list
@item_pages, @items = paginate :items, :per_page => 10
end
def show
@item = Item.find(params[:id])
end
def new
@item = Item.new
end
def create
@item = Item.new(params[:item])
if @item.save
flash[:notice] = Item was successfully created.
redirect_to :action => list
else
render :action => new
end
end
def edit
@item = Item.find(params[:id])
end
def update
@item = Item.find(params[:id])
if @item.update_attributes(params[:item])
flash[:notice] = Item was successfully updated.
redirect_to :action => show, :id => @item
else
render :action => edit
end
end
def destroy
Item.find(params[:id]).destroy
redirect_to :action => list
end
end
例として、listというメソッドを見てみよう。
ここでは、itemsテーブルからレコードを取得して、それを10行ごとにページ処理してビューに渡している。
paginateというのは関数で、標準的であるためActionControllerという機能で提供されているとのこと。
paginateの一つ目の引数はモデル名で、ここではItemを取出すので、:Itemを指定する。2つ目以降はオプションになっている。
ここでは、次のように変更して、新しいブックマークが上にくるように並べてみる。
注:本では、'id desc となっているが、'id desc'と文字列を閉じること。
def list
@item_pages, @items = paginate :items, :per_page => 10, :order_by => id desc
end
見た目をなおす
URLをクリックしたらリンク先に飛ぶようにする。
C:\Ruby\InstantRails?\rails_apps\bookmark\app\views\item\list.rhtmlをエディタで開いて次のように修正する。
本は、URLリンクを閉じるタグが抜けているような気がする。
HTMLタグをエスケープする方法を知らないので、編集モードにして見てください。
-
<% for item in @items %>
- <%=h item.title %>
- <%=h item.description %>
<%= link_to '[x]',{ :action =>
destroy, :id => item }, :confirm =>Are you sure?%>
<% end %>
<%= link_to Previous page, { :page => @item_pages.current.previous } if @item_pages.current.previous %>
<%= link_to Next page, { :page => @item_pages.current.next } if @item_pages.current.next %>
<%= link_to New item, :action => new %>
バリデーションの追加
登録時にデータの妥当性をチェックする。Railsにはバリデーションを支援する仕組みが用意されているらしく、必須の設定や文字列の長さなどは、ActiveRecordに一行書くだけで済むらしい。
今回の設定内容
- url, titleを必須
- urlには://という文字があること
- descriptionは512文字以内
C:\Ruby\InstantRails?\rails_apps\bookmark\app\models\item.rbをエディタで開き、次のように修正する。
class Item < ActiveRecord::Base validates_presence_of :url, :title validates_format_of :url, :with=>/:\/\// validates_length_of :description, :within=>0..512 end
これに合致しない内容を入力すると、赤いエラーが表示される。
検索できるようにする
listアクションに機能を追加して、検索用キーワードを入力すると、全レコードのurl,titel,descriptionから合致するものを選べるようにする
listアクションにキーワードが入力されたときだけ、SQLが実行されるようにする。
コントローラ(C:\Ruby\InstantRails?\rails_apps\bookmark\app\controllers\item_controller.rb)をエディタで開き、以下のように修正する。
一文字でも間違っていると動かないので苦労した。
def list
if @params[:keyword]
keyword = "%"+@params[:keyword]+"%"
@item_pages, @items = paginate :item, :per_page => 10,
:conditions=>[" url LIKE ? OR title LIKE ? OR description LIKE ?", keyword, keyword, keyword]
else
@item_pages, @items = paginate :item, :per_page => 10
end
end
アドレスhttp://localhost:3000/item/list?keyword=testをたたくと検索が行われる。testの部分が検索する単語。
listの定義に間違いがあると、エラーが出るので、そのメッセージをみて打ち間違いをなおすこと。
検索ボックスを追加
検索ボックスがでるように表示を変更する。
C:\Ruby\InstantRails\rails_apps\bookmark\app\views\item\list.rhtmlをエディタで開く。
次のように修正する。
私の場合、上にも書いたように漢字コードの指定がうまくいっていないので、本では日本語のところ(キーワードと検索)を(Wordとsearch)にして行った。その後、生成されたHTMLを見たら漢字コードがutf-8と指定されていた。そこで、その部分を日本語に直した。
注意:漢字を使うときは、utf-8を使えるエディターを使い、明示的にutf-8で保存しないとshift-jisになって変な表示で悩む。
最初は英語にやったほうがいいような気がする。
HTMLタグをエスケープする方法を知らないので、編集モードにして見てください。
<%= form_tag :action=>"list" %>
Word:
<%= submit_tag "search" %>
<% end_form_tag %>
-
<% for item in @items %>
- <%= link_to h(item.title), :url=>item.url %>
- <%=h item.description %>
<%= link_to '[Edit]', :action =>
edit, :id => item %> <%= link_to '[x]',{ :action =>destroy, :id => item }, :confirm =>Are you sure?%>
<% end %>
<%= link_to Previous page, { :page => @item_pages.current.previous, :keyword=>@params[:keyword] } if @item_pages.current.previous %>
<%= link_to Next page, { :page => @item_pages.current.next, :keyword=>@params[:keyword] } if @item_pages.current.next %>
Wordのところをキーワード、searchのところを検索とした場合、次のように表示される。
<%= link_to New item, :action => new %>
次のように表示され、検索ができるようになる。
これで個人で使うブックマークの基本はできた。

とりあえず終り。