home changes contents help options

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_charset

protected 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 bookmark

C:\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に一行書くだけで済むらしい。

今回の設定内容

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 %>

次のように表示され、検索ができるようになる。

これで個人で使うブックマークの基本はできた。

とりあえず終り。