走り出すRails

scaffoldを使ってみるが、何故かフォームが表示されない、、、と思ってたらどうやら Rails 2.0 からそういう仕様になったらしい。

scaffoldを生成しても、フィールドが含まれない画面しか表示されない

Rails 1.xではテーブルに含まれるすべてのフィールドが生成されるビューに自動で含まれましたが、Rails 2.0ではscaffold生成時にビューに含める項目を明示的に指定する必要があります。下記の例のようにフィード名:型(例:name:string mail_address:string)を指定してください。

なんだか勉強用途では面倒な気がしないでもないが、こっちの方が実用面では良いのかな。

手元にある本は Rails 2.0 よりも前のバージョンをベースにしているため細かな違いがある。_form.rhtml という共通のフォームテンプレートが以前はあったらしいが、今では個別に作成されるらしい。共通にしたかったら自前で何とかすると言う事か。

とりあえず下記のエントリーを参考になんとか scaffold は試せた。

知っておかないとちょっとしたところでつまづく事があって大変だ。

さぁこれで次のステップへ進もうとして独自のメソッド追加を試みる。あれ?うまく動かない、、、と思ってたらどうも Rails 2.0 からは方法が変わったらしい。 config/routes.rb に記述の追加が必要なようだ。searchメソッドを追加する場合は以下のように行を追加する。最初に追加した時に下側へ記述したらうまく行かなかった。上に書かれた記述が優先されると言う事らしい。

ActionController::Routing::Routes.draw do |map|
  map.resources :books, :collection => {:search => :get}
  map.resources :books

これで一安心と思ったらビューに関しての変更点に引っかかった。end_form_tag は廃止になった模様だ。

<%= form_tag %>
    keyword: <%= text_field_tag 'keyword', params[:keyword] %>
    <%= submit_tag 'search' %>
<%= end_form_tag %>

適当に調べて変更したらこんな感じになるようだ。とりあえず正常に動いているっぽいので大丈夫だろう。

<% form_tag do %>
    keyword: <%= text_field_tag 'keyword', params[:keyword] %>
    <%= submit_tag 'search' %>
<% end %>

*[Ruby]EmacsでのRails開発

手元のまだ読んでいない雑誌に Rails 2.0 の情報がないかと調べていたら Emacs を使った Rails 開発の記事が WEB+DB PRESS Vol.39 にあった。どうやら emacs-rails という便利そうなものがある。早速インストールして起動すると、Emacs 22 以上が必要だと、、、。今使っている Emacs 21 では使えないらしい。使っているOSが Mac OS X 10.3 なので最新の Carbon Emacs が動くかどうかわからない。とりあえず、emacs-railsの方をあきらめる事にした。

しかしちょっと悔しいので erb で便利なように mmm-mode を導入する事にした。昔友人に教えてもらっていたが、今まで使うと気はなかった。今回は erb を編集するのであるのとないのでは大違いだ。ちょっと .emacs への追加量が多かったがなんとか完了。gettext-mode がインストールされていない様なのだが、検索しても良くわからなかったのと、とりあえず色が変わってモードも切り替わるので深く追求しない事にした。

;; mmm-mode
(add-to-list 'load-path "~/.emacs.d/mmm")
(require 'mmm-mode)
(require 'mmm-auto)
(setq mmm-global-mode 'maybe)
(setq mmm-submode-decoration-level 2)
(set-face-background 'mmm-output-submode-face  "DarkBlue")
(set-face-background 'mmm-code-submode-face    "Purple")
(set-face-background 'mmm-comment-submode-face "DarkGreen")
(set-face-background 'mmm-special-submode-face "Yellow")

(mmm-add-classes
 '((erb-code
    :submode ruby-mode
    :match-face (("<%#" . mmm-comment-submode-face)
		 ("<%=" . mmm-output-submode-face)
		 ("<%"  . mmm-code-submode-face))
    :front "<%[#=]?"
    :back "%>"
    :insert ((?% erb-code       nil @ "<%"  @ " " _ " " @ "%>" @)
	     (?# erb-comment    nil @ "<%#" @ " " _ " " @ "%>" @)
	     (?% erb-expression nil @ "<%=" @ " " _ " " @ "%>" @))
    )))

(mmm-add-classes
 '((gettext
    :submode gettext-mode
    :front "_(['¥']"
    :face mmm-special-submode-face
    :back "[¥"'])")))

(mmm-add-classes
 '((html-script
    :submode javascript-mode
    :front "<script>"
    :back  "</script>")))

(add-to-list 'auto-mode-alist '("¥¥.erb$" . html-mode))

(add-hook 'html-mode-hook
	  (lambda ()
		 (setq mmm-classes '(erb-code html-js html-script gettext embedded-css))
		 (mmm-mode-on)))

(add-to-list 'mmm-mode-ext-classes-alist '(ruby-mode nil gettext))

(global-set-key [f8] 'mmm-parse-buffer)