2009-06-09 5 views
8

ルビーの[]カッコをオーバーライドする方法は?

Rubyは、 id = "Jobs_clearance"name = "Jobs[clearance]"でHTML selectタグを作成します。

次のようにパラメータを送信します。私のコントローラは次のようになります:

class JobsController < ApplicationController 
    def foo 
    @clearance = params[:Jobs[clearance]] 
    end 

残念ながら、Rubyは":Jobs[clearance]"の代わりに":Jobs"をシンボルとして読みます。
[]をエスケープする方法はありますか?バックスラッシュは機能しません。

答えて

10

は、すべてのリクエストパラメータのハッシュです。しかし、params[:Jobs]は、すべてのハッシュです:ジョブのパラメータ。したがって、params[:Jobs][:clearance]を呼び出すと、params[:Jobs]オブジェクトの[]メソッドが呼び出され、:clearanceがパラメータとして渡されます。

+1

チャームのように働いた。おかげでkmorris! –

49

kmorrisはあなたの問題を解決しましたが、あなたの質問に答えたいと思います: (ほとんどすべてのような)メソッドなので、[]と[] =演算子をオーバーライドできます。たくさんのものを壊すことができるからです。

class AntiArray < Array 

    def [](ind) 
    self.fetch(-ind) 
    end 

end 

y = AntiArray.new([1,2,3,4]) 

y[1] 

=> 4 
+5

+1:これは知っておくことが重要です – TomZ

+0

'y [1] = 5'がうまくいくようにする方法は? – Gherman

0

@ゲーマン、あなたの質問の回答を得ようとしました。

2.1.3 :025 > class AntiArray < Array 
2.1.3 :026?>  def [](ind) 
2.1.3 :027?>   self.fetch(-ind) + 1 
2.1.3 :028?>  end 
2.1.3 :029?> end 
=> :[] 
2.1.3 :030 > y = AntiArray.new([1,2,3,4]) 
=> [1, 2, 3, 4] 
2.1.3 :031 > y[1] 
=> 5 
2.1.3 :032 > 

ご希望のものです。お試しください

関連する問題