2009-06-09 30 views
8

Tôi viết một mẫu yêu cầu Ajax với Ruby on Rails sử dụng một thẻ collection_select trông như thế này:cách ghi đè [] dấu ngoặc trong ruby?

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

Ruby sau đó xây dựng một chọn thẻ HTML với id = "Jobs_clearance"name = "Jobs[clearance]"

Tôi muốn gửi tham số để điều khiển của tôi, trông như thế này:

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

Thật không may, Ruby chỉ đọc ":Jobs" như biểu tượng thay vì ":Jobs[clearance]"
Có cách nào để thoát khỏi số [] không? dấu gạch chéo ngược không hoạt động.

Trả lời

10

Bạn cần phải sử dụng params[:Jobs][:clearance]

params là một hash của tất cả các thông số yêu cầu. Nhưng params[:Jobs] cũng là một hàm băm của tất cả: Thông số công việc. Vì vậy, gọi số params[:Jobs][:clearance] đang gọi phương thức [] trên đối tượng params[:Jobs] chuyển số :clearance làm tham số.

+1

hoạt động như một sự quyến rũ. Cảm ơn kmorris! –

49

kmorris giải quyết vấn đề của bạn (rất tốt) nhưng tôi muốn trả lời câu hỏi của bạn: bạn có thể ghi đè [] và [] = toán tử vì chúng là phương pháp (như hầu hết mọi thứ), nhưng bạn nên suy nghĩ kỹ đang làm vì bạn có thể phá vỡ rất nhiều thứ.

class AntiArray < Array 

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

end 

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

y[1] 

=> 4 
+5

+1: Điều này rất quan trọng để biết – TomZ

+0

Làm thế nào để làm cho nó để 'y [1] = 5' có thể làm việc? – Gherman

0

@German, đã cố gắng nhận câu trả lời cho câu hỏi của bạn.

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 > 

Hy vọng đây là những gì bạn đang yêu cầu. Được thử cho bạn

Các vấn đề liên quan