Rails quan điểm và điều khiển của tôi được rải rác với redirect_to
, link_to
và form_for
các cuộc gọi phương pháp. Đôi khi link_to
và redirect_to
rõ ràng trong các đường dẫn mà chúng đang liên kết (ví dụ link_to 'New Person', new_person_path
), nhưng nhiều lần các đường dẫn được ẩn (ví dụ link_to 'Show', person
).
Tôi thêm một số kế thừa bảng đơn (STI) vào mô hình của tôi (giả sử Employee < Person
) và tất cả các phương thức này đều phá vỡ một thể hiện của lớp con (giả sử Employee
); khi đường ray thực thi link_to @person
, nó lỗi với undefined method employee_path' for #<#<Class:0x000001022bcd40>:0x0000010226d038>
. Rails đang tìm kiếm một tuyến đường được xác định bởi tên lớp của đối tượng, đó là nhân viên. Các tuyến nhân viên này không được xác định và không có bộ điều khiển nhân viên nên các hành động cũng không được xác định.
Câu hỏi này đã được hỏi trước đây:
- Tại StackOverflow , câu trả lời là chỉnh sửa mọi phiên bản của link_to, v.v. trong toàn bộ cơ sở mã của bạn và nêu rõ đường dẫn
- Trên StackOverflow một lần nữa, hai người đề nghị sử dụng
routes.rb
để ánh xạ các tài nguyên của lớp con sang lớp cha (map.resources :employees, :controller => 'people'
). Câu trả lời hàng đầu trong cùng câu hỏi SO đó gợi ý việc tạo kiểu cho mọi đối tượng thể hiện trong cơ sở mã bằng cách sử dụng.becomes
- Còn một câu hỏi khác tại StackOverflow , câu trả lời hàng đầu là cách trong trại Do Lặp lại chính mình và gợi ý tạo giàn giáo trùng lặp cho mỗi lớp con.
- Đây là câu hỏi tương tự một lần nữa tại SO, trong đó câu trả lời hàng đầu dường như chỉ sai (Rails Magic Just Works!)
- Ở những nơi khác trên web, tôi tìm thấy bài đăng trên blog này trong đó F2Andy khuyên bạn nên chỉnh sửa trong đường dẫn ở mọi nơi trong mã.
- Trên bài đăng trên blog Kế thừa bảng đơn và các tuyến RESTful tại Thiết kế thực tế logic, nên ánh xạ các tài nguyên cho lớp con tới bộ điều khiển siêu lớp, như trong câu trả lời SO số 2 ở trên.
- Alex Reisner có một bài đăng Kế thừa bảng đơn trong Rails , trong đó ông chủ trương chống lại việc ánh xạ tài nguyên của các lớp con sang lớp cha mẹ
routes.rb
, vì điều đó chỉ bắt các ngắt định tuyến từlink_to
vàredirect_to
, chứ không phải từform_for
. Vì vậy, ông đề nghị thay vì thêm một phương thức vào lớp cha để có được các lớp con nói dối về lớp của chúng. Nghe có vẻ hay, nhưng phương pháp của anh ấy đã cho tôi lỗiundefined local variable or method `child' for #
.
Vì vậy, câu trả lời mà dường như thanh lịch nhất và có sự đồng thuận nhất (nhưng nó không phải là tất cả mà tao nhã, cũng không phải là nhiều sự đồng thuận), là thêm các nguồn lực để bạn routes.rb
. Ngoại trừ điều này không làm việc cho form_for
. Tôi cần một chút rõ ràng! Để chắt lọc các lựa chọn ở trên, các tùy chọn của tôi là
- ánh xạ tài nguyên của lớp con tới bộ điều khiển của lớp cha trong
routes.rb
(và hy vọng tôi không cần gọi form_for trên bất kỳ lớp con nào) - Ghi đè các phương thức nội bộ đường ray để làm cho các lớp nằm với nhau
- Chỉnh sửa mọi phiên bản trong mã trong đó đường dẫn đến hành động của đối tượng được gọi ngầm hoặc rõ ràng, thay đổi đường dẫn hoặc truyền kiểu đối tượng.
Với tất cả những câu trả lời mâu thuẫn này, tôi cần một phán quyết. Dường như với tôi như không có câu trả lời tốt. Đây có phải là một thất bại trong thiết kế đường ray? Nếu vậy, nó có phải là một lỗi có thể được sửa chữa? Hoặc nếu không, thì tôi hy vọng ai đó có thể giúp tôi giải quyết vấn đề này, hướng dẫn tôi những ưu và nhược điểm của từng lựa chọn (hoặc giải thích tại sao đó không phải là một lựa chọn), và câu trả lời nào là đúng và tại sao. Hoặc có một câu trả lời đúng mà tôi không tìm thấy trên web?