目次
- 今回(モデルと管理画面追加)
- 次回(タグの追加)
セットアップ
radiantはgemで入れる。2010年7月現在、バージョン0.9.1が入るはず。
1 | sudo gem install radiant |
0.9.1は比較的安定している模様なので、今回はこれをベースに開発する。
今回は「お小遣い帳をCMSに追加する」エクステンションを開発する。
で、
のとおり(おおむね)の手順で、必要なモデル「小遣い帳の項目」を作成する。
Radiant自身と、Extensionの雛形を作る。
1 2 3 4 5 6 7 8 9 10 11 | radiant -d mysql cash-book mysql> create database cash_book_development default charset utf8 default collate utf8_general_ci ; #=>Query OK, 1 row affected (0.02 sec) cd cash-book/ rake db:bootstrap ruby script/generate extension cash-memo |
ここで、Radiant自身はscaffoldジェネレータを用意してくれない……ので、別のRailsアプリを一旦作成し、そっちのscaffoldで雛形を作成、コピーして使用する。
1 2 3 4 5 6 7 8 9 10 11 12 13 | cd .. rails cash-book-tmp cd cash-book-tmp/ ruby script/generate scaffold Admin::CashItem \ name:string paid_at:datetime \ user_id:integer amount:integer \ note:text cp -rv app/views/admin ../cash-book/vendor/extensions/cash_memo/app/views/ cp -rv app/controllers/admin ../cash-book/vendor/extensions/cash_memo/app/controllers/ cp -rv app/models/admin ../cash-book/vendor/extensions/cash_memo/app/models/ cp -rv db/migrate/* ../cash-book/vendor/extensions/cash_memo/db/migrate/ mv -v ../cash-book/vendor/extensions/cash_memo/app/models/admin/cash_item.rb ../cash-book/vendor/extensions/cash_memo/app/models/ rmdir ../cash-book/vendor/extensions/cash_memo/app/models/admin/ |
詰まったところ
- ここで、間違えて application_controller.rb までコピーしてしまうと、Radiant自体が起動しなくなる。。。
動くように改修
さて、Railsは、Scaffoldで作成された各種スクリプトについて、ネームスペース付きの場合はそのままでは使用できない。。。以下の要件で、何ヶ所か修正する。sedでもGUIテキストエディタでもいいけど、一括変換で問題ないだろう。
- View:
cash_itemと名の付くものをadmin_cash_itemに変更する。path名、変数名など。また、form_forの中など、モデルをそのままpathに変換している箇所は、1
admin_cash_item_path(@admin_cash_item)
のようにしないと動作しない。
- Controller: クラス名を変更、あとはViewと同じ要領で変更。特に、createやupdateでのリダイレクト先指定などが引っかかる。また、params[:cash_item]は変更してはいけないことを留意する
- Model:
1
belongs_to :userを宣言。ふつうにRadiantで使用しているモデルに対して、has_many/belongs_toを宣言できる。
- Migration file: ファイル名を「*_create_cash_items.rb」に、クラス名を「CreateCashItems」に、テーブル名を「:cash_items」にする
完成したscaffoldファイルは、一応githubにアップしてある。まあ、エラーが出るたびに潰していくのがいいと思う。
また、 vendor/extensions/cash_memo/config/routes.rb を以下のように作成。define_routesは消える予定なので使わない。警告が出ます。
1 2 3 4 5 | ActionController::Routing::Routes.draw do |map| map.namespace :admin do |admin| admin.resources :cash_items end end |
また、管理画面にタブを作成するため、 vendor/extensions/cash_memo/cash_memo_extension.rb 内の activate メソッドに以下の記述を追加する。
1 2 3 4 5 | def activate
tab 'Content' do
add_item "小遣い帳", "/admin/cash_items", :after => "Pages"
end
end |
これで、
1 | rake radiant:extensions:cash_memo:migrate |
テーブルが追加されたのを確認して
1 | ruby script/server -e development |
これで、小遣い帳の項目をRadiantに記録できるようになった。
今回、Userはプルダウンから選べる方がいいに決まっているので、scaffoldを以下のように修正している。
vendor/extensions/cash_memo/cash_memo_extension.rb に追記
1 2 3 4 5 6 7 8 9 10 11 12 | def activate + User.class_eval { + has_many :cash_items + def to_option + [self.name, self.id] + end + + def User.all_as_options + User.all.map(&:to_option) + end + } ... |
vendor/extensions/cash_memo/app/views/admin/cash_items/(edit|new).html.erb に追記
1 2 3 4 5 | <% form_for(@admin_cash_item, :url => ...) do |f| %> ... - <%= f.text_field :user_id %> + <%= f.select :user_id, User.all_as_options %> ... |
管理画面がいまいちと思うなら、Railsと同様にViewを編集して見栄えよくすることも出来る。
次回
モデルの追加と管理画面だけなのに、長くなってしまった、、、次回は、タグを追加し、小遣い帳の記録をページに表示するところをやります。


Pingback: Radiant CMSのExtensionを作る – タグ追加篇 « ディスコ探偵冬景色