すがブロ

sugamasaoのhatenablogだよ

Ruby on Rails にほんのちょぴり触れた

久しぶりに触ってみた

Rails といえば誰も使わないブックマークシステムだよね。というわけで、ちょっと試してみた。
bookmark という DB を作って、 rails コマンドでスケルトンを作成。
テーブル定義はこんな感じ。

mysql> desc bookmarks;
+---------+-----------+------+-----+-------------------+----------------+
| Field   | Type      | Null | Key | Default           | Extra          |
+---------+-----------+------+-----+-------------------+----------------+
| id      | int(11)   | NO   | PRI | NULL              | auto_increment | 
| url     | text      | NO   |     |                   |                | 
| comment | text      | YES  |     | NULL              |                | 
| update  | timestamp | NO   |     | CURRENT_TIMESTAMP |                | 
+---------+-----------+------+-----+-------------------+----------------+

view を作って ActionController にデータを渡す。

<h1>Bookmark#new</h1>
<p>Find me in app/views/bookmark/new.html.erb</p>

<%= form_tag :action => 'new' %>
<%= text_field :param, 'url' %>
<%= text_field :param, 'comment' %>
<%= submit_tag 'bookmarking!' %>

これを受け取るRuby

class BookmarkController < ApplicationController

  def new
    @bk = Bookmark.new(params[:param])
  end 

  def list
  end 

  def edit
  end 
end

とかやってみたんだけど、なぜかエラーになる。

ActiveRecord::DangerousAttributeError in BookmarkController#new
update is defined by ActiveRecord

以前 wiki を作ってみよう! みたいのをやったときは普通にパラメータを渡せたんだが。。。
というか、 update は既に定義済み? みたいなことを言われてもこっちは定義してねーんだから勝手に重複してんじゃねーよ、というのが率直なところ><

と思ったが

まじまじと見てみると、確かに udate というメソッドを上書きしていたことが判明><
ruby スクリプト的には無かったのだけど、テーブルのフィールドで update という名前を使っていた!><
というわけで、以下のようにすることで登録から一覧の表示までできた。

alter tabel bookmarks change `update` `update_time` timestamp;

その後、各 rails スクリプトを以下のように編集。

  • view
  1 <h1>Bookmark#new</h1>
  2 <p>Find me in app/views/bookmark/new.html.erb</p>  3 
  4 <%= form_tag :action => 'create' %>
  5 <%= text_field :bookmark, 'url' %>
  6 <%= text_field :bookmark, 'comment' %>
  7 <%= submit_tag 'bookmarking!' %>
  1 <h1>Bookmark#list</h1>
  2 <p>Find me in app/views/bookmark/list.html.erb</p>
  3 <%= @list.map {|list| "id -> #{list.id}, url -> #{list.url}, comment -> #{list.comment}, time -> #{list.update_time}" }.join('<br>') %>
  • controller
  1 class BookmarkController < ApplicationController
  2 
  3   def new
  4   end
  5 
  6   def create
  7     @bookmark = Bookmark.new(params[:bookmark])
  8     if @bookmark.save
  9        redirect_to :action => 'list'
 10     end
 11   end
 12 
 13   def list
 14     #@bookmark = Bookmark.new
 15     @list = Bookmark.find(:all)
 16   end
 17 
 18   def edit
 19   end
 20 end

これで http://localhost:3000/bookmark/new にアクセスして、テキストフィールドに値を入れてボタンを押すと一覧が表示されるプログラムを作る事ができた。
やばい。一度やってしまえばこれはリアル10分作業だな。。。

ちなみに

update 問題にぶつかるまでが15分くらいで、「お、さすが rails !超早いぜ!」とか思ったのだが、 update の壁にぶつかって2時間ちょっとかかったwww
それと、 update の問題が解決してから一覧の表示までで10分くらいだった。