2010-06-23 13 views
22

Tôi đang sử dụng Ruby on Rails và cần chạy một khối mã Ruby trong một trong các tệp html.erb của tôi. Tôi phải làm nó như thế này:Làm cách nào để chạy nhiều dòng Ruby trong tệp html.erb

<% def name %> 
<% name = username %> 
<%= name %> 

hay như thế này:

<% def name 
name = username %> 
<%= name %> 

Cảm ơn bạn đã đọc.

+0

Tại sao bạn đang cố tạo hàm trong chế độ xem? Nó thuộc về nhiều khả năng nhất trong mô hình, hoặc nếu không vào trong bộ điều khiển, nhưng chắc chắn không nhìn vào khung cảnh – jigfox

+0

Xin lỗi, tôi chỉ cần gõ một số mã vào đó làm ví dụ. – ben

Trả lời

22

Việc định nghĩa phương thức trong tệp ERB là không bình thường, vì vậy tôi khuyên bạn nên sử dụng phương pháp này.

Nếu bạn muốn gọi một khối như #each, bạn có thể làm điều gì đó như sau:

<% names.each do |name| %> 
    <%= name %> 
<% end %> 

Đừng quên <% end %>.

+2

và bạn quên một '|' sau '| name' ;-) – jigfox

34

Nếu bạn cần thêm chức năng trong chế độ xem của mình, bạn thường khai báo những chức năng bên trong trình trợ giúp.

Đối với mỗi bộ điều khiển, nếu có trình trợ giúp, nó sẽ được tải tự động. Ví dụ, nếu bạn có một PeopleController, trong thư mục app/helpers, cần có một people_helper.rb, và nó sẽ giống như thế này

module PeopleHelper 
    def name 
    #do something 
    username 
    end 
end 

khác, thay thế rất sạch sẽ, là sử dụng Presenterpattern, nhưng tôi nghĩ rằng nó ít phổ biến hơn (không may).

Ngược lại, nếu bạn cần nhiều dòng mã ruby ​​bên một cái nhìn ERB, mà tôi cố gắng tránh, tôi thích phong cách sau đây:

<% 
    counter_1 = 0 
    counter_2 = 1 
    do_some_more_prep_here 
%> 
<% @records.each do |rec|%> 
    <%# do something with the prepped date in each row %> 
<% end %> 

Cũng cho tôi mã thụt đầu dòng quan trọng hơn html thụt đầu dòng , vì vậy tôi sẽ thích một cái gì đó như

<table> 
    <% @rows.each do |row| %> 
    <tr> 
     <td><%= row.item1 %></td> 
     <% if row.some_test %> 
     <td><%= row.item2 %></td> 
     <% end %> 
    </tr> 
    <% end %> 
</table> 

Nhưng tôi luôn rất quan tâm để nghe ý kiến ​​khác nhau về vấn đề này.

+3

Các phương thức trợ giúp là cách để đi, chắc chắn. – tadman

-1

Tôi có thể tưởng tượng ai đó cần nó trong một mẫu cụ thể (không có điểm trong việc tạo người trợ giúp) để không trùng lặp đánh dấu html. Đó là, khi kết quả trang html có một vài khối tương tự của đánh dấu html. Mặc dù, nó có thể dễ dàng bị lạm dụng (mã không đọc được).

<% def f1(a, b, c) %> 
    test: <%= a %>, <%= b %>, <%= c %> 
<% end %> 

<% f1(1, 2, 3) %> 
<% f1(4, 5, 6) %> 
+0

điều này dường như không hoạt động đối với tôi https://i.imgur.com/oWOu5v8.png – barlop

+0

câu trả lời của bạn không hoạt động, tất cả những gì bạn đang làm là đưa nội dung của chức năng lên một trang web, coi đó là HTML không phải là đường ray hoặc mã ruby ​​https://i.imgur.com/rhTNtt5.png – barlop

+0

@barlop Xin lỗi vì đã không được cộng tác. Kiểm tra câu trả lời của tôi. Điều đó có hiệu quả với bạn không? Đó có lẽ là ý tôi. –

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