2011-08-29 28 views
5

Tôi có một hình thức đơn giản:Tại sao Rails UjS ajax: liên kết thành công được gọi hai lần?

= form_for(posts_path, :id => "new_post", :remote => true) do 
    = text_field_tag "post[input]" 
    = submit_tag "Post!" 

Tôi đã bị ràng buộc một callback để sự kiện ajax:success:

$("form#new_post").bind("ajax:success", function(xhr, data, status){ 
    alert("Post Created!"); 
}); 

Khi tôi bấm vào nút Post!, các Post Created đi lên hai lần. Tại sao?

Tôi đang sử dụng Rails 3.1 theo mặc định là sử dụng jquery-ujs.

Trả lời

5

Điều tương tự cũng xảy ra với tôi khi nâng cấp ứng dụng từ Rails 3.0 lên 3.1, đó là lỗi của tôi. Trong

app/assets/javascripts/application.js 

séc của bạn mà bạn không được gọi gấp đôi so với đường ray giúp đỡ, tôi có khó khăn sử dụng

//= require_tree . 

tôi đã gỡ bỏ này và vừa mới rời khỏi

//= require jquery 
//= require jquery_ujs 
//= require myscripts 

i xóa quá app/assets/javascripts/rails.js, tệp được tạo bởi đá quý jquery-ray nhưng điều này không còn cần thiết

+0

Tôi có cùng sự cố và nội dung javascript của tôi không được bao gồm hai lần. ajax: thành công vẫn được gọi là hai lần, ngay cả khi không có chỉ thị require_tree đang hoạt động. –

+0

Cảm ơn. Tôi đã từng gặp vấn đề tương tự. Loại bỏ require_tree đã giúp giải quyết vấn đề. –

9

Đó là vì trang của bạn đang tải mã jquery_ujs hai lần trong chế độ phát triển khi tài sản biên dịch sẵn có trong /public/assets.

Trong chế độ phát triển javascript requries được tải bằng các thẻ riêng biệt: jquery, jquery_ujs.js, myscripts.js và cuối cùng là applications.js. Vấn đề xảy ra khi biên dịch trước application.js tồn tại và được sử dụng từ /public/assets - nó chứa tất cả các tệp trước đó. Điều này được kích hoạt bởi assets:precompile nhiệm vụ cào.

Giải pháp là xóa /public/assets thư mục khi phát triển sau đó application.js được sử dụng (từ /app/assets/javascript) không bao gồm các tệp trước đó. Nói chung không sử dụng nhiệm vụcào khi phát triển.

Cập nhật

Thêm config.serve_static_assets = false-development.rb cũng giải quyết vấn đề đối với tôi mà không lo lắng về /public/assets.

0

Đối với tôi Gotcha là lựa chọn

config.assets.debug = true 

.

+0

ý của bạn là gì? Tôi đang gặp vấn đề này và cũng có dòng này trong development.rb của tôi. Tôi có nên xóa nó không? – Blake

+1

Thực ra tôi đã tìm thấy nó với phương pháp "thử và lỗi" vì tôi thấy trong Firebug, javascript đã được nạp hai lần và do đó ràng buộc được thực hiện hai lần (dẫn đến cuộc gọi ajax dư thừa).Dù sao, tôi nghi ngờ đó là vì tôi đã biên dịch trước các tài sản cục bộ (vì việc triển khai cho heroku) kết hợp với debug = true. Dù sao, khi tôi đã đặt 'config.assets.debug = false', nó không còn được bao gồm hai lần nữa. – Beffa

+0

Cảm ơn bạn đã phản hồi. Nó chỉ ra rằng vấn đề của tôi cũng là kịch bản được nạp hai lần. Tôi đã di chuyển xung quanh các yếu tố dom, khiến kịch bản của tôi chạy lại. Tôi đã sửa nó bằng cách chạy tập lệnh sau khi sự kiện window.onload được kích hoạt. – Blake

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