13F

備忘録

rails 2.0.2でhttp_authenticationがうまく動かない

2008-04-29 03:04:51 | Ruby
ふつうに
ruby script/plugin install http_authentication
ruby script/generate scaffold hoge
rake db:migrate
して、HogeControllerに
before_filter :authenticate
def authenticate
  authenticate_or_request_with_http_basic do |user, pass|
    true
  end
end
してるだけなんだけど、「protected method `render' called for #<HogeController...」みたいなNoMethodErrorが出て動かない。Google検索では同じような報告が数件あるものの原因はわかっていない。 関係する部分を簡略化すると下のような構造になっているようなんだけど、これだけ見ると逆になんで動く人がいるのか不思議だ。何か勘違いしているんだろうか?
module PluginModule
  extend self

  module ControllerMethods
    def authenticate
      PluginModule.authentication_request(self)
    end
  end

  # このメソッドも PluginModule も HogeController とは何の関係もない
  # ので、protected メソッドが呼べるとは思えない…
  def authentication_request(controller)
    controller.render
  end
end

class HogeController < ApplicationController
  def action
    authenticate
  end

protected
  def render
    puts "ok!"
  end
end

# プラグインの init.rb でやってること
ApplicationController.send :include, PluginModule::ControllerMethods

# ブラウザからなんか呼び出してみたときに行われること?
# protected method (render) へのアクセス違反が発生
HogeController.new.action
HogeControllerに public :render とか書いちゃえばもちろん動くんだけど問題ないんだろうか?

(追記)解決した。1.2.6 だと動くので、1.2.6 と 2.0.2 の差分を眺めていたら actionpack/lib/action_controller.rb のところでようやく気がついた。2.0 からはHTTP認証は組み込みになっていてプラグインは要らず、入れると逆におかしくなるってことのようだ。ちゃんと変更点は把握しないと。。

上の構造についても、controller.render のように直接呼び出すのではなく controller.send :render に変わっていてようやく納得・安心できた(個人的に、調べたときに何で動くのかわからないと怖くて使えない……)。ただ、1.2.6 でなんでうまくいくのかは謎のまま。

Ruby認定証

2008-02-08 23:16:57 | Ruby
Ruby Associationの資格試験を去年の12月1日に受けたんだけど、一昨日ようやく認定証が届いた。メールで一言だけの通知を受けてから一ヶ月以上音沙汰が無かったので、合格はメール発送のミスか何かなんじゃないかと半分本気で思ってたよ。

認定証に使っているらしい出雲民芸紙に時間がかかったのだろうか。

Ruby認定試験

2007-12-15 02:20:25 | Ruby
合格だそうで。

今まで、周囲に難易度を聞かれたときお茶を濁すような回答をしていたが、これで心置きなく「簡単だった」と言うことができる。落ちておいて言ってもただの馬鹿だしなあ。

Ruby認定試験受けてきた

2007-12-01 20:24:28 | Ruby
東京会場で受けてきた。

解答欄がひとつずつずれていたとかいうことでもなければ合格はできたと思うけど、この程度で Certified Ruby Programmer と呼べるのかどうか……以下感想。
  • 普段使いもしないコマンドラインオプションとか環境変数とかirbコマンドを必死こいて覚えていったら全く出題されず。覚えてもしょうがないから問題無しでいいやという判断自体は正しいと思うけど、それなら出題範囲から外せばいいのに……。
  • 言語自体の仕様よりも、組み込みクラス(特にArray,Hash,String。あとDir,File,Range,Timeあたりが少し)のメソッドクイズのほうに重点が置かれていた。
  • わかりづらい言葉遣いは勘弁してほしい。たとえば、
    いくつかの代入文とか
    
    if true
      puts 何か
    elsif ~
      puts 他の何か
    end
    みたいなプログラムの「結果がどうなるか」とか。「結果」が「最後に返される値」のことなら nil だろうが、「出力」のことなら「何か」になるとか、そういうの。しかも「nil」も「何か」も選択肢に存在するという……。


Rubyの制御構造

2007-11-26 21:11:27 | Ruby
Rubyは色々な状況でいろんな文を書くことができるので、リファレンスに載ってないような場合にどうなるのかよくわからないことがある…。たとえば制御構造。
def m1
  yield
end

def m2(&block)
  block.call
end

def m3(proc)
  proc.call
end

m1 { return :block }             # LocalJumpError: unexpected return
m1(&(Proc.new { return :proc })) # LocalJumpError: unexpected return
m1(&(lambda { return :lambda })) # LocalJumpError: unexpected return *1
m2 { return :block }             # LocalJumpError: unexpected return
m2(&(Proc.new { return :proc })) # LocalJumpError: unexpected return
m2(&(lambda { return :lambda })) # => :lambda *2
m3(Proc.new { return :proc })    # LocalJumpError: unexpected return
m3(lambda { return :lambda })    # => :lambda

m1 { break :block }              # => :block
m1(&(Proc.new { break :proc }))  # LocalJumpError: break from proc-closure *3
m1(&(lambda { break :lambda }))  # LocalJumpError: break from proc-closure
m2 { break :block }              # => :block
m2(&(Proc.new { break :proc }))  # LocalJumpError: break from proc-closure
m2(&(lambda { break :lambda }))  # => :lambda *4
m3(Proc.new { break :proc })     # LocalJumpError: break from proc-closure
m3(lambda { break :lambda })     # => :lambda

  • *1 がダメで *2 がOKなのがよくわからない……
  • *3 とか *4 は、Rubyリファレンスマニュアルの2007/10/14更新版 ではOKとされているっぽいけど、実際はダメみたい。
  • next はどのパターンでもOKみたいなので、next使うのがいいのかな?