如何在Ruby中重载[]括号?

11

我正在使用Ruby on Rails编写一个Ajax请求表单,其中包含一个像这样的collection_select标签:

<%= collection_select("Jobs", "clearance", @allClearances, "clearance", "clearance", {:prompt => "Select a Clearance"} )%>

Ruby接着构建了一个HTML select标签,其中id = "Jobs_clearance"name = "Jobs[clearance]"

我想要将这个参数发送给我的控制器,控制器长这样:

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

遗憾的是,Ruby只将":Jobs"作为符号读取,而不是":Jobs[clearance]"
有没有一种方法可以转义[]?反斜杠无法起作用。

3个回答

55

kmorris解决了你的问题(非常好),但我想回答你的问题: 你可以重载[]和[]=操作符,因为它们都是方法(几乎和其他所有东西一样),但你应该仔细考虑你在做什么,因为你可能会破坏很多东西。

class AntiArray < Array

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

end

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

y[1]

=> 4

11

您需要使用params[:Jobs][:clearance]

params是包含所有请求参数的哈希表。但是,params[:Jobs]也是一个包含所有 :Jobs 参数的哈希表。因此,调用params[:Jobs][:clearance]是在params[:Jobs]对象上调用[]方法,并将:clearance作为参数传递。


0

@German,我试着回答你的问题。

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 > 

希望这就是你所要求的。为你尝试了一下。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接