中高生国際Rubyプログラミングコンテスト

三鷹産業プラザなるところに行ってきた。





が、だれもいなかった。





携帯で確認すると26日(土)の開催。今日は27日(日)。





・・・





少しショックなのは、週末に場所と日時を確認し、
その上で日曜日と結論を出したことだ。
なんか疲れてるのかな。。。





そして今、家に戻って洗濯をしている。
今日は天気がいいね。

PostgreSQLでテーブル継承機能を使う場合のActiveRecord側の対処

PostgreSQLにはテーブル継承という機能がある。
あまり利用されていないかもしれないが、
使いようによってはかなり便利な機能かもしれない。





ただ、これをRailsで使うには、
ActiveRecord::Baseを継承するモデル側で少し工夫をしてやらなければならない。
普通はテーブルの情報をDBから自動的に取得するのだが、
テーブル継承は少々特殊なので、この点がうまくいかないのだ。
だからモデル内で必要な情報を指定してあげなければならない。





こんな感じ





class SomeClass < ActiveRecord::Base
set_primary_key(:id)
end





単に主キーを明示的に指定するだけなのだが。





一応、備忘録として残したいと思う。

とうとう「RailsによるアジャイルWebアプリケーション開発 第4版」が出る

http://ssl.ohmsha.co.jp/cgi-bin/menu.cgi?&ISBN=978-4-274-06866-9



待ちかねましたよ、Ohmushaさん・・・



しかし待った甲斐があり、
今回出るのはなんと原著の電子版同様Rails3.1対応とのこと。
原著でも紙で出版されてるものは、まだ3.1対応していない(はず)。



お〜!



今月サービスインする今のプロジェクトはRails3.1で作ってるけど、
Assetあたりの最新機能はあまり使っていない。
是非これでまとまった勉強をしたい。



本は11月に出るようだけど、アマゾンではまだ検索に引っかからないようだ。
値段は税抜きで3,200円と第3版よりちょうど1,000円安い。
間違いではなければうれしいけど、本当だろうか。
今までの翻訳資産があったり、洋書だから円高効果があるのかもだが。



ソフトバンククリエイティブあたりが出してる情報処理系の本って、
なぜだか知らないけどすごく軽い。
この本かなり重いから、軽くなってるとうれしいなあ。
耐久性が落ちても、進歩の早いフレームワークだから内容自体どのみち2〜3年の寿命だし。



何はともあれ楽しみ。

ActiveRecordでid以外の主キーを指定すると、createメソッドが使えない

主キーを例えば「code」にしたいという場合、
「set_primary_key」メソッドを使って明示的に主キーを指定するのだが、
この「code」が連番などでない自然キーだったりすると、
当然フォームからキーを入力したくなる。





ところが


User.create(code: 'a', name: 'Tom')


などとしても「code」には値が設定されず、warningが出てきてしまう。


WARNING: Can't mass-assign these protected attributes: code





idは通常連番なので、外部から明示的に指定できないようにしているようなのだが、
主キーが自然キーで手動入力したい場合は困ることになる。



↓ダメ
user = User.create(params[:user])


↓これもダメ
user = User.new(params[:user])


↓これは大丈夫
user = User.new
user.code = 'a'
user.save





http://guides.rubyonrails.org/security.html#mass-assignment
↑この仕組みで保護されているので、これを回避するには、





1.attr_accessor(:code, :name)などと明示的に保護しないすべてのカラムを指定する(カラムが多いと面倒)


2.海外のブログによると「'composite_primary_keys」gemを使うといけるとあったが、今日やってみたらダメだった
http://roninonrails.blogspot.com/2008/06/using-non-standard-primary-keys-with.html


3.user = User.create(params[:user], without_protection: true)
こんな感じで明示的に保護機能を無効にする


4.モデルで以下のように保護カラム一覧から該当のカラムを削除する
protected_attributes.delete('code')





今回は「4」のやり方で回避した。「1」はカラムが多くなると面倒だし、指定し忘れもあり得る。「2」はできなかったため。「3」はcodeに対する保護機能は無効にしたいが、保護機能自体は使いたいという場合に使えないため、というのが理由だ。





protected_attributesはBlackListクラスのオブジェクトなのだが、
BlackListクラスはさかのぼるとRubyの標準添付ライブラリ「Set」を継承しているので、
Setクラスのdeleteメソッドを使った。





ちなみに「type」カラムもこの保護が利いているが、
typeの場合は前にも書いたように回避方法がある。
http://d.hatena.ne.jp/twotrees/201106





今回の対処は実装を追った場当たり的な対処なので、
実装が変更になると動かなくなるのが難点だが、
一応今回の目的には一番合致したので採用した。
また使うかもしれないので備忘録として残しておく。

Rails3.1でEpigraphを(なんとか)動かす

前回の日記で書いたモンキーパッチで落ちる部分は、
以前モジュールだったものがクラスになっており、
かつクラス名(以前はモジュール名)が変わっていただけだったので、
割と簡単に修正して問題は解決した。





しかしそのあと、Webrickは立ち上がるようになったのだが、


Internal Server Error
undefined method `debug_rjs=' for ActionView::Base:Class


などと画面にアクセスするとブラウザにエラーが表示され、
リロードしてみると


Template is missing

Missing template redline/standard_crud/index with {:handlers=>[:erb, :builder, :haml], :formats=>[:html], :locale=>[:ja, :ja]}. Searched in:


テンプレートが見つからないなどと理不尽なことを言われ、
しばらく途方にくれていた。





結局これは、「config/environments/xxx」ファイルに記述されている、


config.action_view.debug_rjs = true


この設定がもはやなくなったようで、この行を消したら無事動くようになった。





しかし表面上は動いてもいろいろなところで細かく違うかもしれないので、
Rails3.1でいったんプロジェクトを作成し、
ディレクトリの構成が異なる部分や、configディレクトリ内のファイルを、
Epigraphの方へひとつひとつ移動することで移行することにした。


なんだかassetsディレクトリがappだけでなく、libやvendorあたりにもある。
よくわからない。あと、GemfileやRakefile、script/railsファイルも忘れずにコピー。


2.3.xから3.0へ移行したときにはWEB-DB PRESSのvol.58を参考にした覚えがある。
あの号は好評だったらしく割とすぐに品切れになったように記憶しているが、
次の号あたりでRails3.1の特集でもやってもらえないだろうか。
前回くらいの充実度なら絶対に買うのだが。





あとI18nが少し変わったようだ。
Epigraphではテーブルをpublicスキーマにすべて置くのではなく、
いくつかのスキーマへ分散して配置しているのだが、
そのため「articleスキーマのcategoryモデル」みたいな場合は、


attributes:
article:
category:
position: "並び順"
name: "カテゴリー名"
category_id: "親カテゴリ"


のようにしていたが、これからは


attributes:
article/ategory:
position: "並び順"
name: "カテゴリー名"
category_id: "親カテゴリ"


このようにネストさせない形で記述しなければならないらしい。
というか以前は思いっきりこの形だったのだが、
これは無駄だからネストさせるべきだと思って、一括修正したのだが。。。
まあいい。これも産みの苦しみ。





あとWindows環境だけかもしれないが、
node.jsがどうとかパーミッションがこうとかでWebricが起動しなかったので、
Gemfileの以下の箇所をごっそりコメントアウトした。
たぶんassetsのところが問題なんだろうけど、
分からないものはすべてコメントアウトとすることに。


group :assets do
gem 'sass-rails', " ~> 3.1.0"
gem 'coffee-rails', "~> 3.1.0"
gem 'uglifier'
end


group :test do
# Pretty printed test output
gem 'turn', :require => false
end





とりあえずI18nの修正をすべて終わったら、
httpストリーミングを実装してみたい。
Webricではダメでunicornというのを使わないといけないらしいのだが。


またはまりそうでいやだが、前進あるのみ。

EpigraphをRails3.1で動かしてみた→撃沈

そんなすんなり行くわけないかなと反省。





Rails自体のアップグレードはBundlerですんなりうまくいったが、
pgのバージョンが「0.11.0」でなければダメだと怒られた。
「0.9.0」を固定で指定していたのだが、指定を消して0.11.0へアップグレード。
もう1.0.0でいいのではないだろうか。。。





ここまではすんなりいったが、
自分でモンキーパッチを当てた部分が落ちる。
メソッド名がないとか言うから、元のプログラムがかなり変更になったのだろうか。





もう遅いから、追々がんばることにしたい。