2005-04-24 (Sun) [長年日記]
_ action以外のメソッドをpublicにしてはいけない
何となく、以下のaction_methodsの実装を見て気になっていたのだが、 Railsのコントローラのメソッドでpublicなものは、すべてaction として扱われてしまう(=外部から呼び出し可能になる)ようだ。
def action_methods @action_methods ||= (self.class.public_instance_methods - self.class.hidden_actions) end
これって周知されてる?
気持ちはわからなくもないけど、メソッドの可視性をそのまま使ってしまうのは あまりよくないと思う。
def show ... end action_method :show
とかの方がよかったんじゃないかなあ。
まあ、でも、Railsっぽいなという気はする。 Railsを使う時は、Railsの慣習をよく知っておかないと危険かもしれない。 適当にやってても動いてしまうだけに。
自分は、
def action_methods return ["list", "show", ...] end
とでもしとくかな。 public_instance_methodsのコスト *1 を免れるし。
*1 Railsでpublic_instance_methodsが遅いのは、mix-inを多用しているせいかもしれない。
_ image_tagと絶対URI
image_tag(というかcompute_public_auth)にhttp://hostname/path/to/fileのような 絶対URIを渡しても、相対パスとして扱われてしまうようだ。
そういうもの?
コントローラの可視性はサービスの可視性と一致するはず、という前提に立てば、action_methodを別途設けてしまうのはDRYじゃない:-) ということかと。<br>本家のMLでも以前話題になってたはずです。
しかし、privateなんて使わねーよというRubyユーザも多いわけで、<br>「 コントローラの可視性はサービスの可視性と一致するはず」という方針ならもっとチュートリアルとかでもがんがん<br>アピールするべきなんじゃないですかねえ。<br><br>言語レベルのメソッドの可視性というのはあくまでもプログラミング上の利便性のためにあるものなので、<br>「コントローラの可視性はサービスの可視性と一致するはず」<br>という前提条件を説明なしにユーザに強いるのは、少々乱暴な気もします。
on_hoge で hoge というサービス,でいーと思うんだけどなぁ.規約万歳なら.
それだとだいぶ問題は少ないですねえ。<br><br>でもまつもとさんはon_hogeとか嫌いって言ってたような。<br>いや、do_hogeか。
DHHの発言を見つけました。↓これですね。<br>http://one.textdrive.com/pipermail/rails/2005-February/003093.html<br><br>まー、DHHって「少々乱暴」ギミなところはありそうです。あと、ドキュメントも数のわりに整理されてないかもしれません。HowToが多いのはそれはそれで便利なんですけど。
そうですねえ。<br><br>SQL/Javascript injectionやらの話も含めた`Secure Programming HOWTO'みたいなのが欲しいなあ。