Nó không khả dụng 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 với nó để trình bày. Điều này, theo định nghĩa, thuộc về khung nhìn, không phải mô hình.
Dưới đây là một số giải pháp:
Sử dụng người trình bày hoặc đối tượng mô hình dạng xem để dàn xếp giữa mô hình và dạng xem. Điều này gần như chắc chắn đòi hỏi nhiều 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 trình trợ giúp trong mô hình người trình bày / chế độ xem không vi phạm MVC, vì chúng nằm trong lớp chế độ xem, thay thế trình trợ giúp Rails tùy chỉnh truyền thống và chế độ xem đầy logic.
Rõ ràng include ActionView::Helpers::NumberHelper
trong JobsHelper
thay vì phụ thuộc vào Rails để tải nó một cách kỳ diệu cho bạn. Điều này vẫn chưa tuyệt vời, vì bạn không nên truy cập trình trợ giúp từ một mô hình.
Vi phạm MVC & SRP . Xem câu trả lời của fguillen để biết cách thực hiện việc này. Tôi sẽ không lặp lại nó ở đây vì tôi không đồng ý với nó. Tuy nhiên, thậm chí nhiều hơn thế, tôi không đồng ý với việc làm ô nhiễm mô hình của bạn với các phương pháp trình bày như trong câu trả lời của Sam .
Nếu bạn nghĩ “nhưng tôi thực sự cần cái này để viết to_csv
& to_pdf
phương pháp của tôi trong mô hình của tôi!”, Thì toàn bộ tiền đề của bạn là sai — sau cùng, bạn không có to_html
phương pháp, phải không? Và đối tượng của bạn thường được hiển thị dưới dạng HTML. Cân nhắ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ì ( vì nó không nên ).
Đối với việc sử dụng trợ giúp cho các lỗi xác thực ActiveModel trong mô hình, tôi xin lỗi nhưng ActiveModel / Rails đã khiến tất cả chúng tôi gặp khó khăn bằng cách buộc các thông báo lỗi được nhận ra trong lớp dữ liệu, thay vì trả về ý tưởng ngữ nghĩa của lỗi. nhận ra sau— thở dài . Bạn có thể khắc phục điều này, nhưng về cơ bản nó có nghĩa là không sử dụng ActiveModel :: Errors nữa. Tôi đã làm nó, nó hoạt động tốt.
Ngoài ra, đây là một cách hữu ích để đưa người trợ giúp vào mô hình người trình bày / chế độ xem mà không làm ô nhiễm tập hợp các phương pháp của nó (vì có thể làm được điều đó chẳng MyPresenterOrViewModel.new.link_to(...)
có nghĩa lý gì):
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