как переопределить [] скобки в ruby? - PullRequest
10 голосов
/ 09 июня 2009

Я пишу форму запроса Ajax с Ruby on Rails, используя тег collection_select, который выглядит следующим образом:

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

Затем Ruby создает HTML-тег выбора с id = "Jobs_clearance" и name = "Jobs[clearance]"

Я хочу отправить параметр на мой контроллер, который выглядит следующим образом:

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

К сожалению, Ruby читает ":Jobs" как символ вместо ":Jobs[clearance]"
Есть ли способ убежать от []? обратная косая черта не работает.

Ответы [ 3 ]

53 голосов
/ 10 июня 2009

kmorris решил вашу проблему (очень хорошо), но я хотел бы ответить на ваш вопрос: Вы можете переопределить операторы [] и [] =, потому что они являются методами (как почти все), но вы должны хорошо подумать о том, что вы делаете, потому что вы можете разбить кучу вещей.

class AntiArray < Array

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

end

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

y[1]

=> 4
10 голосов
/ 09 июня 2009

Вам нужно использовать params[:Jobs][:clearance]

params - это хэш всех параметров запроса. Но params[:Jobs] ТАКЖЕ хэш всего: параметры заданий. Поэтому вызов params[:Jobs][:clearance] вызывает метод [] объекта params[:Jobs], передавая :clearance в качестве параметра.

0 голосов
/ 23 ноября 2014

@ Немецкий, попытался получить ответ на ваш вопрос.

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 > 

Надеюсь, это то, что вы просите. Для вас дана попытка

...