2010-09-27 31 views
6

Giả sử tôi có một khuôn mẫu của Ruby ERB tên my_template.html.erb, và nó chứa những điều sau đây:Có cách nào để liệt kê các biến có sẵn trong mẫu Ruby ERB không?

<div><%= @div_1 %></div> 
<div><%= @div_2 %></div> 
<div><%= @div_3 %></div> 

Có cách nào tôi programatically có thể liệt kê ra tất cả các biến có sẵn trong mẫu?

Ví dụ, phương pháp sau đây:

def list_out_variables 
    template = File.open("path_to/my_template.html.erb", "rb").read 
    erb = ERB.new(template) 
    erb.this_method_would_list_out_variables 
end 

sẽ quay trở lại một cái gì đó như:

['div1','div2','div3'] 

Bất kỳ trợ giúp sẽ được đánh giá rất nhiều.

Cảm ơn, Mike

+1

Không biết nếu nó thực sự có thể, nhưng nó có vẻ như một ý tưởng tồi đối với tôi. Thông thường, xem phụ thuộc vào bộ điều khiển, không phải cách khác xung quanh. –

Trả lời

21

Để có được một danh sách các biến sẵn cho tập tin .erb của bạn (từ bộ điều khiển):

Thêm một breakpoint trong ERB:

<% debugger %> 

Sau đó nhập instance_variables vào trình gỡ lỗi để xem tất cả các biến mẫu có sẵn.

Đã thêm: Lưu ý rằng instance_variables là một phương thức có sẵn từ đối tượng lớp Ruby và tất cả các lớp con của nó. (Như đã lưu ý bởi @mikezter.) Vì vậy, bạn có thể gọi phương thức lập trình từ bên trong sw của bạn thay vì sử dụng trình gỡ lỗi nếu bạn thực sự muốn.

Bạn sẽ lấy lại danh sách các biến mẫu cho đối tượng hiện tại.

Added: Để có được một danh sách các biến được sử dụng bởi một file .erb:

# <template> is loaded with the entire contents of the .erb file as 
# one long string 
var_array = template.scan(/(\@[a-z]+[0-9a-z]*)/i).uniq 
+1

-1 để nói 'instance_variables' là một lệnh debugger. Đó là một phương pháp trên 'Object' – mikezter

+4

@mikezter: -1? Có vẻ hơi khắc nghiệt. Tài liệu trình gỡ lỗi (xem liên kết trong câu trả lời) không rõ ràng. Tôi đã upvoted bình luận của bạn nếu bạn chỉ đơn giản là chỉ ra rằng gõ instance_variables trong trình gỡ rối thực sự gửi tên phương thức đó cho đối tượng hiện tại. –

+0

Cảm ơn sự giúp đỡ! Đối với bất kỳ ai khác: nhóm chụp trong regex (dấu ngoặc đơn) là không cần thiết, và gây ra một mảng lồng nhau thay vì chỉ là một mảng của các tên biến. –

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