先日、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