目次

セットアップ

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

ext01

ext02

これで、小遣い帳の項目を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を編集して見栄えよくすることも出来る。

次回

モデルの追加と管理画面だけなのに、長くなってしまった、、、次回は、タグを追加し、小遣い帳の記録をページに表示するところをやります。