<< >>

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の関係を持つモデルがあるとして、スペジェネの利用手順を記載します。

モデル間の関係

Group
has_many
Member
has_many
Favorite
has_many
Song

モデル定義

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

同様に他のクラスに関しても定義します。

実行

サーバ起動

% ruby script/server

通常版

http://localhost:3000/group/list

Ajax版

http://localhost:3000/group/

動作環境

  • 最新の svn trunk (最低でも 3500↑)

問題点

  • Ajax版で削除したときに親リストの項目が反映されない。
  • IPE の空白問題に対応できてない。(修正できなくなる)
  • 長い文字列の表示。

参考

FAQ

Ajax版はいらない

YourController#index を削除して下さい。

has_many のリンクを消したい

無効にしたい関連の所有側のコントローラから has_many の行を削除し、
所属側のコントローラから belongs_to の行を削除して下さい。

IPEをやめたい

現状では、Ajax版のViewはIPEのみです。
コントローラの ipe_for を削除すると、
エディタは起動しますがコントローラ側のアクションを消すことができます。

どうしても?

どうしてもです。

FAQの追加はこの辺↓

本日のツッコミ(全8件) [ツッコミを入れる]
_ noname (2006-02-05 01:31)

うは、最高 早速試させてもらうか<br>とか思いながら<br>script/generate special group<br>とかやると<br>wrong number of arguments (1 for 0)<br>と怒られてしまうですよ。。。

_ noname (2006-02-05 02:17)

-tでエラーどこに出てるんかいなと見てたらgem内で出てる。何故だ。<br>ああん。動作環境読んでなかったよママン<br>死んできます。

_ 从 ’w’) (2006-02-05 02:50)

イキロ!<br>% \rm -rf vendor<br>% svn co ttp://dev.rubyonrails.com/svn/rails/trunk vendor<br>で手元のだけ Edge で動かせるクゥ〜ン!<br>(↑実行するときは ttp の前に h を付けてね)

_ noname (2006-02-05 03:47)

すぺしある素晴らしすぎます。<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 ;

_ noname (2006-02-05 10:47)

has_many & has_manyな対応とかhas_manyをselectタグで選べるようになったりとか妄想してハァハァ

_ 从 ’w’) (2006-02-06 16:18)

あ、そうだ。<br>「URL=スパム」というくまくまルールがあるので、<br>必要であれば、ttp から書くのがオススメ。

_ akausagi (2006-02-06 17:57)

了解です。 メールありがとうございます。<br>メールで頂きました<br>>* belongs_to を所有者へのリンクと考えてよいか?<br>ですけど、確かに所有されている物は所有者を知らないほうがよいですよね。<br>うーん難しいですが、クマさんの頭でよい感じにモデリングして頂けるとことを期待しております

_ Garold (2007-02-20 15:51)

Hi! Very nice content. Interesting how can you do all that? I'm trying to build my site, but have no success for now((.