Nó không có sẵn vì việc sử dụng nó trong một mô hình (thường) vi phạm MVC (và nó dường như trong trường hợp của bạn). Bạn đang lấy dữ liệu và thao tác nó để trình bày. Điều này, theo định nghĩa, thuộc về chế độ xem, không phải là mô hình.
Dưới đây là một số giải pháp:
Sử dụng một chương trình hoặc xem mô hình đối tượng làm trung gian giữa mô hình và xem. Điều này gần như chắc chắn đòi hỏi công việc ban đầu hơn các giải pháp khác, nhưng hầu như luôn luôn là một thiết kế tốt hơn. Việc sử dụng người trợ giúp trong người trình bày/chế độ xem không vi phạm MVC, vì họ cư trú trong lớp chế độ xem, thay thế người trợ giúp Rails tùy chỉnh truyền thống và chế độ xem được lấp đầy logic.
Rõ ràng include ActionView::Helpers::NumberHelper
trong JobsHelper
thay vì tùy thuộc vào Rails đã tải nó một cách kỳ diệu cho bạn. Điều này vẫn không tuyệt vời vì bạn không nên truy cập trình trợ giúp từ mô hình.
Vi phạm MVC & SRP. Xem fguillen’s answer để biết cách thực hiện việc này. Tôi sẽ không lặp lại ở đây vì tôi không đồng ý với điều đó. Mặc dù vậy, tôi không đồng ý với việc làm ô nhiễm mô hình của bạn bằng các phương thức trình bày như trong Sam’s answer.
Nếu bạn nghĩ rằng “nhưng tôi thực sự cần điều này để viết to_csv
& to_pdf
phương pháp của tôi trong mô hình của tôi!”, Sau đó toàn bộ tiền đề của bạn là sai sau khi tất cả, bạn không có một phương pháp to_html
, làm bạn ? Nhưng đối tượng của bạn thường được hiển thị dưới dạng HTML. Xem xét việc tạo một lớp mới để tạo đầu ra của bạn thay vì làm cho mô hình dữ liệu của bạn biết CSV là gì (because it shouldn’t).
Đối với việc sử dụng trình trợ giúp cho lỗi xác thực ActiveModel trong mô hình, tốt, tôi xin lỗi nhưng ActiveModel/Rails đã làm hỏng tất cả chúng ta bằng cách buộc thông báo lỗi được thực hiện trong lớp dữ liệu, thay vì trả về ý tưởng ngữ nghĩa lỗi sẽ được nhận ra sau— tiếng thở dài. Bạn có thể giải quyết vấn đề này, nhưng về cơ bản có nghĩa là không còn sử dụng ActiveModel :: Errors nữa. Tôi đã thực hiện nó, nó hoạt động tốt. Ngoài ra, đây là một cách hữu ích để bao gồm những người trợ giúp trong một người trình bày/mô hình xem mà không gây ô nhiễm tập hợp các phương pháp của nó (vì có thể thực hiện được ví dụ như vậy, ví dụ:MyPresenterOrViewModel.new.link_to(...)
không có ý nghĩa):
class MyPresenterOrViewModel
def some_field
helper.number_to_currency(amount, :precision => 0)
end
private
def helper
@helper ||= Class.new do
include ActionView::Helpers::NumberHelper
end.new
end
end
Nguồn
2011-03-03 04:49:16
Tôi thường thực hiện theo quy tắc này nhưng ngắt nó khi tôi cần trình trợ giúp xem để định dạng thông báo lỗi xác thực được xác định trong mô hình. – Florent2
Bộ sưu tập Rails chọn những người trợ giúp không tôn trọng MVC vì họ muốn thực hiện một phương thức mẫu trên mục có thể chọn để xác định nội dung hiển thị. Vì vậy, trong trường hợp đó bạn có thể hack xung quanh khuôn khổ hoặc vi phạm MVC. – Tony
Đây là lời khuyên tốt, nhưng đó là một câu trả lời không tốt vì nó không giải quyết được câu hỏi. – Jaryl