2010-04-14 30 views
53

Tôi có một kịch bản lệnh jQuery thêm trường mới vào biểu mẫu và trường này chứa thông tin động từ một mảng. Vấn đề là tôi không thể tìm ra cách để thêm một array.each để cư các tùy chọn của trường chọn trong javascript mà không phá vỡ sự thụt đầu dòng HAML và gây ra lỗi.Phương thức Ruby trong Javascript trong HAML

Đây là nỗ lực hết sức mình mà không làm việc:

%script(type="text/javascript") 
    $('#mylink').click(function() { 
    $('#mylink').after('<select> 
    - myarray.each do |options| 
    <option value="#{options.id}">#{options.name}</option> 
    </select>); 
)}; 

Cũng thử nó với: lọc javascript không có may mắn.

+0

Cảm ơn, có vẻ như ai đó đã khắc phục sự cố thụt lề Markdown cho tôi. – Josh

Trả lời

96

Thông thường, nếu một cái gì đó là một cơn đau trong haml, nó có nghĩa là bạn nên refactor bit khó khăn để một người trợ giúp hoặc một phần và gọi đó.

// some_helper.rb 
def new_snazzy_select_tag(options = []) 
    select_tag 'tag_name_here', options.map { |option| [option.id, option.name] } 
end 

Ngoài ra, bạn nên sử dụng bộ lọc :javascript để render javascript vì nó sẽ đặt nó trong một thẻ script cho bạn và cho phép thụt đầu dòng.

Cuối cùng, bạn có thể sử dụng #{ruby_expression} ở bất kỳ đâu trong haml, bao gồm bộ lọc :javascript, rất tiện dụng khi bạn cần xuất kết quả của các biểu thức ruby ​​đến những nơi không phải là nội dung trực tiếp của các phần tử html.

// some_view.html.haml 
:javascript 
    $('#mylink').click(function() { 
    $('#mylink').after("#{escape_javascript new_snazzy_select_tag(myarray)}"); 
    }; 
+0

Tôi khá mới phát triển ứng dụng web, tôi chưa bao giờ nghĩ đến việc sử dụng trình trợ giúp. Tôi đã giữ mã của tôi khá gần MVC, nhưng luôn tự hỏi làm thế nào để có được xung quanh các vòng tôi cần thiết trong quan điểm. Điều đó sẽ hoạt động tốt. Cảm ơn bạn đã trả lời. – Josh

+4

Người trợ giúp thường là một phần giữa chế độ xem và bộ điều khiển. Họ không bao giờ nên thay đổi bất kỳ trạng thái phía máy chủ nào và chỉ đơn giản ở đó để * trợ giúp * với logic xem khó chịu. Ruby trong quan điểm của bạn nên càng ít càng tốt để được rõ ràng và duy trì. Người giúp đỡ giúp đỡ với điều đó. –

+6

TL; DR ...? sử dụng # {ruby_expression} Cảm ơn Alex. – umassthrower

8

Hãy thử điều này, cần làm việc (tất cả tôi đã làm là loại bỏ một không gian duy nhất trong dòng thứ năm và thêm báo giá đóng cửa ngày thứ sáu):

%script(type="text/javascript") 
    $('#mylink').click(function() { 
    $('#mylink').after('<select> 
    - @myarray.each do |options| 
    <option value="#{options.id}">#{options.name}</option> 
    </select>'); 
)}; 

Tuy nhiên, giả sử bạn đang chạy điều này với một kịch bản ruby ​​hoặc khung các loại, tại sao không chỉ làm điều đó bên ngoài khuôn mẫu? Điều đó có lẽ sẽ phù hợp nhất. Trong đường ray/sinatra và các khung công tác khác, bạn có thể sử dụng một phương thức trợ giúp để làm điều này. Nếu bạn nhìn vào tham chiếu haml, chúng thực sự không khuyến khích sử dụng - để đánh giá ruby.

+0

Tôi đã nhập mã từ bộ nhớ mà không có công cụ đánh dấu cú pháp, có vẻ như tôi có một vài lỗi. Tôi không thể kiểm tra tại thời điểm này, nhưng tôi tin rằng điều này vẫn sẽ thất bại. Tôi sẽ đi con đường trợ giúp, mà tôi đã không nghĩ đến trước đây. Cảm ơn bạn. – Josh

+0

Trước đó tôi đã thử nghiệm mã tôi đưa vào câu trả lời của tôi trong một ứng dụng sinatra nhanh chóng, và nó dường như làm việc tốt (không có lỗi haml). Bạn chắc chắn rằng lỗi không phải ở nơi khác? Đây là đầu ra được tạo ra, với các id và tên tùy chọn ngẫu nhiên: http://pastie.org/920686 – ehsanul

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