2011-06-18 20 views
5

Có một số câu hỏi trong toàn bộ bài đăng này đều liên quan đến tiêu đề. Chủ đề tổng thể của bài đăng có thể được tóm tắt là "Tôi đang thiếu gì/Bạn làm điều này tốt hơn như thế nào?"Rails 3.0/3.1, Thực tiễn tốt nhất của jQuery và Ajax

Thông qua các phương pháp thông thường của Googling/screencasts/APIs, tôi vừa học xong một kiến ​​thức bắt đầu làm việc về cách sử dụng combo Rails 3.0-JQuery-Ajax.

Tôi còn lại với một số câu hỏi (có thể khá lớn?). Trong Railscast 242, Ryan kết thúc thực hiện cập nhật cuối cùng để trang bằng cách như sau:

$("#products").html("<%= escape_javascript(render("products")) %>"); 

Lúc đầu, điều này dường như siêu lạ, và nó vẫn có vẻ hơi lạ: template index.js.erb là nhận thức trang index.html có div '#products' và bản thân mẫu index.js.erb là vấn đề gì xảy ra với lệnh cập nhật? Điều này dường như với tôi là một sự vi phạm nhẹ của Tách mối quan tâm - không phải JS trên trang index.html là những gì thực sự cập nhật trang với dữ liệu mà nó nhận được từ bài đăng, trái với kịch bản từ máy chủ là những gì thực sự cập nhật trang? Ngoài ra, điều này có vẻ hơi giòn. Đối với bất kỳ lý do ngu ngốc nào, nếu tôi đổi tên div trên index.html để nói, '#products_collection' và quên thay đổi index.js.erb, thì trang index.html của tôi sẽ vẫn hoạt động, nhưng bản cập nhật Ajax của tôi sẽ không. Tôi muốn biết nếu bạn nghĩ rằng các điểm trên là hợp lệ/phải làm gì nếu chúng có hiệu lực.

Nếu cần, tôi có thể giải thích những điều sau: Nếu bạn nghĩ về hành động chỉ mục nói chung, thì không có vấn đề gì lớn mà index.js biết về index.html. Họ có thể được kết hợp chặt chẽ, nhưng họ loại nên/có thể được. Và bạn bất kỳ loại thử nghiệm nào cũng sẽ khám phá ra sự đổi tên div. khỏe. Nhưng ...

Bây giờ tôi đi đến ý tưởng đi xa hơn xuống lỗ thỏ Ajax: Giả sử bạn tải biểu mẫu mới vào trang chỉ mục thông qua một Ajax nhận được, và sau đó bạn gửi nó qua một bài đăng Ajax. Theo cùng một mẫu, tệp create.js.erb của bạn có thể trông giống như sau:

create.js.erb?

$("#products").prepend("<%=escape_javascript(render 'product_as_table_row', :product => @product))%>"); 

Bây giờ, hành động tạo của tôi cũng nhận biết được trang chỉ mục của tôi trông như thế nào. Hmm ... bây giờ giả sử chúng tôi cũng muốn thực hiện hành vi tương đối chuẩn để cung cấp thông báo cho người dùng thông qua đèn flash:

create.js.erb?

<% flash.each do |key, value| %> 
    $("div#flash").html("<div class='<%=key%>'><%=value%></div>"); 
<% end %> 
$('div#flash div').fadeOut(10000); 

$("#products").prepend("<%=escape_javascript(render 'product_as_table_row', :product => @product))%>"); 

Bây giờ, Ngoài những gì có vẻ với tôi để được gần gũi hơn I'd giống như khớp nối giữa các chỉ số và tạo ra, tôi có cập nhật Flash lớn chất béo này trong mẫu js của tôi. Tôi không thấy làm thế nào tôi có thể tóm tắt điều này đi - Tôi có thể kết hợp nó thành một phương pháp không? Tôi đặt nó ở đâu? Ngay cả khi nó có thể được bao bọc thành một phương thức, sẽ không phải mọi mẫu create.js và update.js đều cần gọi hàm đó và không phải là không có DRY? Đây có phải là mục đích của việc xem thừa kế trong 3.1 không? Bạn có cho rằng Ajax làm cho đèn flash không cần thiết, vì người dùng sẽ thấy sản phẩm của mình ngay trên trang?

Điều gì về lỗi tạo ra? Điều này cũng có được ném vào create.js.erb không?

create.js.erb

<% if @thought.new_record? %> 
    <%# ??? Throw in Validation-Error Form Updates? Display a Modal Dialog? %> 
<% else %> 
    $("#products").prepend("<%=escape_javascript(render 'product_as_table_row', :product => @product))%>"); 
<% end %> 

Nói tóm lại, tôi đã học được làm thế nào để thực hiện được và sau khi có yêu cầu, nhưng tôi không thấy làm thế nào để áp dụng một mô hình Ajax tổng thể cho toàn bộ một tài nguyên DRY- ly và chính xác, hoặc hơn thế nữa, trong suốt ứng dụng của tôi.Những gì tôi đã thấy có vẻ tốt cho những điều nhỏ nhặt, nhưng không phải là tổng thể. JS không phô trương có thể là tốt đẹp trong trừu tượng, nhưng tại thời điểm này nó có vẻ rất Obtrusive vào nhiều ứng dụng của tôi. Chưa bao giờ thực hiện Ajax trong Rails 2.x, tôi không có gì để xây dựng. Vì vậy .. Tất cả điều này dường như cẩu thả dường như với tôi như nó không thể là The Rails Way để làm việc. Tôi đang thiếu gì? Bất kỳ và tất cả cái nhìn sâu sắc được đánh giá cao.

Trả lời

1

tôi mạnh mẽ khuyên bạn nên xem xét bài viết sau đây của một trong những thành viên cốt lõi của nhóm rails_ujs, bao gồm tất cả các tham chiếu ở dưới cùng: rails-2-remote-links-and-forms

+0

Mặc dù đã lâu rồi, cảm ơn rất nhiều vì đã chỉ cho tôi điều này! loại thảo luận này chính xác là những gì tôi đang tìm kiếm. – MissingHandle

+0

Vì tôi vừa nhận được huy hiệu 'câu hỏi phổ biến' cho điều này, tôi đã biết tôi sẽ cập nhật kiến ​​thức phổ biến cho hầu hết các học viên, nhưng đối với người mới, câu trả lời giờ đây nằm trong việc sử dụng khung công tác JS như Backbone.js , hoặc Angular.js, trong đó tôi đã không nhận thức được tại thời điểm tôi đặt ra câu hỏi, và thực sự, Backbone chỉ là 0,5 sau đó. Soo. đối với những người gặp vấn đề này ngày hôm nay, câu trả lời cho các vấn đề của bạn là Backbone.js! (hoặc một cái gì đó như nó). – MissingHandle

2

Bạn có thể bọc tất cả các chức năng, và đặt chúng trong application.js, do đó các mẫu của bạn có thể trông giống như

update_product("<%= escape_javascript(render("products")) %>"); 

add_product("<%=escape_javascript(render 'product_as_table_row', :product => @product))%>"); 

etc.. 

Cùng đi cho việc cập nhật flash và xử lý lỗi

+0

Cảm ơn - điều đó giúp và tôi nghĩ nó đủ điều kiện làm câu trả lời cho đủ câu hỏi của tôi . Tuy nhiên vẫn còn một cái gì đó không thỏa mãn - điều duy nhất dường như bị trừu tượng hóa ở đây là phần tử DOM được cập nhật. Chẳng hạn, sẽ không có cuộc gọi đến phương thức update_flash trong mỗi lần tạo/cập nhật? ... – MissingHandle

+0

jQuery hỗ trợ gọi lại ở các điểm khác nhau trong vòng đời yêu cầu Ajax, vì vậy bạn có thể thêm gọi lại khi hoàn thành/thành công, cho ví dụ và gọi update_flash từ đó –

+0

oh..điểm tốt! Tôi nên xem xét kỹ hơn điều tiếp theo. – MissingHandle

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