2006-02-04 優しいRailsの育て方 [長年日記]
● [Rails] Special Generation (スペジェネ)
スッペシャルで情熱的な機能を持った scaffold
特徴
1. jascaffold の上位互換
jascaffold と同じことは全てできます。というか、jascaffold generator も含まれています。但し、データ(yml)のフォーマットが若干変更されたため、両 generator で定義ファイルの一部に互換性がありません。各機能は宣言部分で無効にできますので、新しいスペジェネを使うことお薦めします。
2. has_many に対応
has_many & belongs_to なモデル関係を扱うことができます。モデルでの Association 宣言に従って、アクション用のロジックモジュールが自動的に生成されます。利用したい Association を両コントローラにそれぞれ宣言することで、所有側の list アクション時に関連へのリンクが追加されます。
3. Ajax によるアクションの実行
通常の各アクションに加えて、Ajax用のアクションとビューが自動的に生成されます。index は Ajax 用ページとなり、ページ遷移することなくこのページだけで一連の操作を実行可能です。
4. IPE に対応
Ajax用ページ(index)では、In Place Editor によって各項目を修正することができます。参照と修正アクションの読み込みが不要になり、低コストでの実行が可能です。
● インストール
svn が利用可能です。
% ruby script/plugin install http://wota.jp/svn/rails/plugins/branches/stable/special
(追記: レポジトリを変更 20060208)
● 使用例
以下のような多:1の関係を持つモデルがあるとして、スペジェネの利用手順を記載します。
モデル間の関係
|
● モデル定義
scaffold はモデルとコントローラを同時に作成することを前提にしていますが、スペジェネではモデルの Association 情報を利用しますので、先にモデルを作成します。(テーブルの複数形問題もあるので通常の scaffold でもこの手順がよいと思います)。
Model
class Group < ActiveRecord::Base has_many :members, :include=>"favorites", :dependent=>true has_many :songs validates_presence_of :name end class Member < ActiveRecord::Base belongs_to :group has_many :favorites, :dependent=>true validates_presence_of :yomi, :name, :comments, :group_id end class Favorite < ActiveRecord::Base belongs_to :member validates_presence_of :name, :member_id end class Song < ActiveRecord::Base belongs_to :group validates_presence_of :name, :content, :group_id end |
● 作成
ローカライズで必要になる文字コードを指定します。plugin で利用できるように、config/environment.rb の先頭に記載します。
文字コード指定
% vi config/environment.rb $KCODE = 'u' |
作成
% script/generate special group % script/generate special member % script/generate special favorite % script/generate special song |
このコマンドを実行するときに必要な動きと発声は以下の通りです。
☆ノノハ ノノ∂_∂∩ <ス ☆ノノハ 川*^∇^∩ <ペ ☆ノノハ ル ’ー’リ∩ <ス ☆ノノハ 州*‘ o‘∩ <ペ ☆ノノハ 川´・_・∩ <シャ ☆ノノノハ 从 ´∇`∩ <ル ☆ノノハ 从*’w’∩ <ジェネレーション! ((つ )〃 (( (_) _) ☆ノノハハ 从oTーT从 <おぁ〜い;;;
(この部分はなくても動作しますが、激しく推奨されています)
● ローカライズ
/usr/share/tdiary/tdiary/regex_rules/syntax-ruby:3:in `require': no such file to load -- syntax/convertors/html (LoadError) from /usr/share/tdiary/tdiary/regex_rules/syntax-ruby:3
同様に他のクラスに関しても定義します。
● 動作環境
- 最新の svn trunk (最低でも 3500↑)
● 問題点
- Ajax版で削除したときに親リストの項目が反映されない。
- IPE の空白問題に対応できてない。(修正できなくなる)
- 長い文字列の表示。
● 参考
- シングルV 「スッペシャル ジェネレ~ション」 http://www.amazon.co.jp/exec/obidos/ASIN/B0007MTBOC
- Berryz工房シングルVクリップス2 http://www.amazon.co.jp/exec/obidos/ASIN/B000CIXIRM/
● FAQ
Ajax版はいらない
YourController#index を削除して下さい。 |
has_many のリンクを消したい
無効にしたい関連の所有側のコントローラから has_many の行を削除し、 所属側のコントローラから belongs_to の行を削除して下さい。 |
IPEをやめたい
現状では、Ajax版のViewはIPEのみです。 コントローラの ipe_for を削除すると、 エディタは起動しますがコントローラ側のアクションを消すことができます。 |
どうしても?
どうしてもです。 |
FAQの追加はこの辺↓


うは、最高 早速試させてもらうか<br>とか思いながら<br>script/generate special group<br>とかやると<br>wrong number of arguments (1 for 0)<br>と怒られてしまうですよ。。。
-tでエラーどこに出てるんかいなと見てたらgem内で出てる。何故だ。<br>ああん。動作環境読んでなかったよママン<br>死んできます。
イキロ!<br>% \rm -rf vendor<br>% svn co ttp://dev.rubyonrails.com/svn/rails/trunk vendor<br>で手元のだけ Edge で動かせるクゥ〜ン!<br>(↑実行するときは ttp の前に h を付けてね)
すぺしある素晴らしすぎます。<br>↓実験する方用SQL<br>CREATE TABLE `favorites` (<br> `id` int(10) unsigned NOT NULL auto_increment,<br> `name` varchar(255) NOT NULL default '',<br> `member_id` int(10) unsigned NOT NULL default '0',<br> PRIMARY KEY (`id`)<br>) TYPE=MyISAM AUTO_INCREMENT=1 ;<br><br><br>CREATE TABLE `groups` (<br> `id` int(10) unsigned NOT NULL auto_increment,<br> `name` varchar(255) NOT NULL default '',<br> PRIMARY KEY (`id`)<br>) TYPE=MyISAM AUTO_INCREMENT=1 ;<br><br><br>CREATE TABLE `members` (<br> `id` int(10) unsigned NOT NULL auto_increment,<br> `name` varchar(255) NOT NULL default '',<br> `yomi` varchar(255) NOT NULL default '',<br> `comments` varchar(255) NOT NULL default '',<br> `group_id` int(10) unsigned NOT NULL default '0',<br> PRIMARY KEY (`id`)<br>) TYPE=MyISAM AUTO_INCREMENT=1 ;<br><br><br>CREATE TABLE `songs` (<br> `id` int(10) unsigned NOT NULL auto_increment,<br> `name` varchar(255) NOT NULL default '',<br> `group_id` int(10) unsigned NOT NULL default '0',<br> `content` varchar(255) NOT NULL default '',<br> PRIMARY KEY (`id`)<br>) TYPE=MyISAM AUTO_INCREMENT=1 ;
has_many & has_manyな対応とかhas_manyをselectタグで選べるようになったりとか妄想してハァハァ
あ、そうだ。<br>「URL=スパム」というくまくまルールがあるので、<br>必要であれば、ttp から書くのがオススメ。
了解です。 メールありがとうございます。<br>メールで頂きました<br>>* belongs_to を所有者へのリンクと考えてよいか?<br>ですけど、確かに所有されている物は所有者を知らないほうがよいですよね。<br>うーん難しいですが、クマさんの頭でよい感じにモデリングして頂けるとことを期待しております
Hi! Very nice content. Interesting how can you do all that? I'm trying to build my site, but have no success for now((.