小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


Ruby On Rails2.2で検索機能を作ってみる(ON さくらインターネット)

先日、Ruby On Rails2.2で作るサンプルアプリケーション(ON さくらインターネット) - 大人になったら肺呼吸 はてなブックマーク - Ruby On Rails2.2で作るサンプルアプリケーション(ON さくらインターネット) - 大人になったら肺呼吸にて、さくらインターネットのサーバ上にRuby on Rails2.2で作成したサンプルアプリケーションを動作させるところまでを試してみた。
今回はこれを拡張し、検索機能を作成してみる。

前回のおさらい(サンプルアプリケーションの自動生成)

mkdir Rails
cd Rails
rails Bookmark -d mysql
cd Bookmark
script/generate scaffold bookmark name:string url:string
chmod -R o+w log tmp

Bookmark/config/database.ymlというデータベースの設定ファイルを以下のように編集する。

development:
  adapter: mysql
  #encoding: utf8
  database: データベース名
  pool: 5
  username: ユーザ名
  password: パスワード
  host: XXX.db.sakura.ne.jp←MySQLのサーバ名

前回は、テーブルを手動で作成していたのだけど、rakeコマンドでテーブルの自動生成が可能ということを知ったので、rakeを使って作成する。すでに同名のテーブルが存在するとエラーになるので、一度削除してから実行すると良い。

%rake db:migrate
(in /home/xxx/Rails/Bookmark)
==  CreateBookmarks: migrating ================================================
-- create_table(:bookmarks)
   -> 0.0033s
==  CreateBookmarks: migrated (0.0035s) =======================================

これで、以下のようなテーブルが自動生成される。

フィールド 種別 属性 ヌル(NULL) デフォルト値 その他
id int(11)   いいえ   auto_increment
name varchar(255)   はい NULL  
url varchar(255)   はい NULL  
created_at datetime   はい NULL  
updated_at datetime   はい NULL  

検索機能の追加

Viewに検索フォームを追加する

/Rails/Bookmark/app/views/bookmarks/index.html.erbを編集し、以下のコードを追加する。

<% form_tag :action => :search do %>
<%= text_field_tag :keyword %>
<%= submit_tag 'search' %>
<% end %>

これにより、実際には以下のようなHTMLコードが出力される。

<form action="/Bookmark/bookmarks/search" method="post"><div style="margin:0;padding:0"><input name="authenticity_token" type="hidden" value="ランダムな文字列" /></div>
<input id="keyword" name="keyword" type="text" />
<input name="commit" type="submit" value="search" />
</form>

この状態で、searchボタンを押下すると、検索処理を行うコントローラに何も修正を加えていないので、もちろんエラーとなる。

Unknown action
No action responded to search. Actions: create, destroy, edit, index, new, show, and update

controllerに検索アクションを追加する

/Rails/Bookmark/app/views/controllers/bookmarks_controller.rbを編集し、以下のコードを追加する。find_all_by_nameメソッドは、nameカラムを引数で与えられた値で検索し、その結果を返すメソッド。

def search
  @bookmarks = Bookmark.find_all_by_name(params[:keyword])
  render :action => 'index'
end

検索機能の確認


テキストボックスにaaaと入力してsearchボタンを押下すれば、aaaだけが出力されるようになる。