2011-01-29 24 views
6

Tôi muốn tạo ra một liên kết "tiêu diệt" cơ bản trong Rails ngày hôm nay, vì vậy tôi đã viết này:Tại sao các tệp javascript mặc định được yêu cầu để tạo liên kết hủy trong đường ray?

<%= link_to "destroy me", @company, :method=>:delete 
%> 

Các mã được tạo là:

<a href="/companies/1" 
data-method="delete" 
rel="nofollow">destroy me</a> 

Trong các tuyến đường của tôi, thông thường

resources :companies 

Và hành động phá hủy của tôi nằm trong bộ điều khiển của tôi.

Nhưng bất cứ khi nào tôi nhấp vào liên kết, tôi sẽ được chuyển hướng đến hành động show. Kỳ dị.

Hóa ra tôi đã không bao gồm các dòng sau trong cách bố trí của tôi:

<%= javascript_include_tag :defaults %> 

Sau bao gồm nó, liên kết phá hủy làm việc!

Tại sao? Tại sao tôi cần phải bao gồm các thẻ javascript mặc định để thực hiện công việc này?

Và vì tôi không muốn sử dụng mẫu thử nghiệm, làm cách nào để chỉ bao gồm các tệp tôi cần?

Trả lời

6

Kể từ 3.0, trình trợ giúp biểu mẫu Rails tạo thẻ HTML sạch với thuộc tính dữ liệu HTML5 (phương pháp dữ liệu trong ví dụ của bạn). Để hỗ trợ các thuộc tính dữ liệu này, rails.js là bắt buộc đối với nguyên mẫu. Nếu bạn sử dụng jQuery, thì phiên bản jQuery (https://github.com/rails/jquery-ujs) là cần thiết. Đơn giản chỉ cần đặt, rails.js cùng với khung javascript (nguyên mẫu hoặc jquery) thực hiện một số phép thuật để móc nhấp và các sự kiện khác trên thẻ, khác khôn ngoan khi bạn nhấp vào liên kết, nhấp chuột bình thường xảy ra vì không có javascript, liên kết là một liên kết bình thường.

+0

Câu trả lời hàng đầu ở đó. – changelog

2

Đó là do các giới hạn của html và thực tế là các thẻ neo không thể gửi yêu cầu với bất kỳ phương thức nào khác ngoài GET.

Nếu bạn nhìn vào rails.js (sẽ được bao gồm với :defaults), khi bạn nhấp vào liên kết có "phương pháp dữ liệu", nó sẽ tạo và gửi biểu mẫu sử dụng đúng phương pháp http để gửi đến url được chỉ định trong thẻ neo.

Đó là một hack của một cách giải quyết, nhưng không thực sự có tùy chọn nào khác để tạo các thẻ neo bình thường gửi các yêu cầu DELETE (hoặc bất kỳ động từ HTTP nào khác GET).

Nếu bạn không muốn sử dụng js, hãy sử dụng biểu mẫu (có thể sử dụng button_to thay vì link_to) để thực hiện yêu cầu. Nếu bạn tạo helper của riêng bạn để xây dựng biểu mẫu, bạn có thể làm cho nó sử dụng thẻ nút (trái ngược với một đầu vào mà đường ray xây dựng) mà là phong cách khá dễ dàng để làm cho trông giống như một liên kết bình thường.

+0

Tại sao bỏ phiếu xuống? Câu trả lời của tôi có đúng không? – idlefingers

+0

Bỏ phiếu xuống không phải của tôi, nhưng câu trả lời của James là tại chỗ. – changelog

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