如何覆盖ruby中的[]括号?

时间:2009-06-09 16:15:09

标签: ruby-on-rails ruby select escaping

我正在使用带有collection_select标记的Ruby on Rails编写Ajax请求表单,如下所示:

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

Ruby然后使用id = "Jobs_clearance"name = "Jobs[clearance]"

构建HTML选择标记

我想将参数发送到我的控制器,如下所示:

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

不幸的是,Ruby只读取":Jobs"作为符号而不是":Jobs[clearance]"
有没有办法逃脱[]的?反斜杠不起作用。

3 个答案:

答案 0 :(得分:53)

kmorris解决了你的问题(非常好),但我想回答你的问题: 你可以覆盖[]和[] =运算符,因为它们是方法(就像几乎所有的东西一样),但是你应该好好考虑一下你正在做什么,因为你可以打破很多东西。

class AntiArray < Array

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

end

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

y[1]

=> 4

答案 1 :(得分:10)

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

params是所有请求参数的哈希值。但是params[:Jobs]也是所有的哈希:作业参数。因此,调用params[:Jobs][:clearance]会将[]对象上的params[:Jobs]方法作为参数传递给:clearance

答案 2 :(得分: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 > 

希望这是你要求的。给你一个尝试