モデルでの使用は(通常)MVCに違反しているため使用できません(あなたの場合はそうです)。データを取得して、プレゼンテーション用に操作しています。これは、定義上、モデルではなくビューに属しています。
ここにいくつかの解決策があります:
プレゼンターまたはビューモデルオブジェクトを使用して、モデルとビューを仲介します。これはほぼ間違いなく他のソリューションよりも多くの初期作業を必要としますが、ほとんどの場合、より優れた設計です。プレゼンター/ビューモデルでヘルパーを使用しても、ビューレイヤーに常駐するため、従来のカスタムRailsヘルパーやロジックで満たされたビューを置き換えるため、MVCに違反しません。
Railsに魔法のように読み込ませるのでinclude ActionView::Helpers::NumberHelper
はJobsHelper
なく、明示的に読み込みます。モデルからヘルパーにアクセスすべきではないため、これはまだ素晴らしいことではありません。
MVCおよびSRPに違反します。これを行う方法については、fguillenの回答を参照してください。同意しないので、ここではエコーしません。ただし、サムの回答のように、プレゼンテーション方法でモデルを汚染することに同意しませんか。
「でも、モデルにto_csv
&to_pdf
メソッドを書くためにこれが本当に必要なのです!」と思う場合は、全体の前提が間違ってto_html
います。結局のところ、メソッドがないのですか?それでも、オブジェクトはHTMLとしてレンダリングされることが非常によくあります。データモデルにCSVが何であるかを認識させるのではなく、出力を生成するための新しいクラスを作成することを検討してください(CSVが認識できないため)。
モデルでActiveModel検証エラーのヘルパーを使用することについては、申し訳ありませんが、ActiveModel / Railsはエラーメッセージをデータレイヤーで実現することを強制し、エラーのセマンティックなアイデアを後で実現- ため息。これは回避できますが、基本的にはActiveModel :: Errorsを使用しないことを意味します。私はそれをやった、それはうまくいきます。
余談ですが、メソッドのセットを汚染することなくプレゼンター/ビューモデルにヘルパーを含めるための便利な方法を以下に示します(たとえば、実行できてMyPresenterOrViewModel.new.link_to(...)
も意味がないため)。
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