[解決済み] number_to_currency "ヘルパーメソッドをビューではなく、モデルで使用するには?
質問
私は
to_dollar
メソッドを使いたいと思います。
module JobsHelper
def to_dollar(amount)
if amount < 0
number_to_currency(amount.abs, :precision => 0, :format => "-%u%n")
else
number_to_currency(amount, :precision => 0)
end
end
end
class Job < ActiveRecord::Base
include JobsHelper
def details
return "Only " + to_dollar(part_amount_received) +
" out of " + to_dollar(price) + " received."
end
end
残念ながら
number_to_currency
メソッドはここでは認識されません。
未定義のメソッド `number_to_currency' for #<Job:0x311eb00>
どうすれば動くようになるのか、何かアイデアはありますか?
どのように解決するのですか?
モデルでの使用は(一般的に)MVCに違反するため、使用できません(あなたのケースではそのように見えます)。あなたはデータを取得し、プレゼンテーションのためにそれを操作しています。これは、定義上、モデルではなくビューに属します。
ここにいくつかの解決策があります。
-
モデルとビューの間を仲介するために、プレゼンターまたはビューモデルオブジェクトを使用します。これは他の解決策よりも間違いなく多くの初期作業を必要としますが、ほとんどの場合、より良い設計です。ヘルパーをプレゼンター/ビューモデルで使用しても、ビュー層に存在するためMVCには違反せず、従来のカスタムRailsヘルパーやロジック満載のビューに取って代わります。
-
明示的に
include ActionView::Helpers::NumberHelper
でJobsHelper
を、Railsが魔法のように読み込んでくれることに依存するのではなく、の中に入れてください。モデルからヘルパーにアクセスすることはできないので、これはまだ素晴らしいことではありません。 -
MVC &に違反する。 SRP . 参照 fguillenの回答 をご覧ください。私はそれに同意しないので、ここで反響を呼ぶことはしません。それ以上に、以下のようなプレゼンテーション手法でモデルを汚染することに同意できません。 サムの答え .
もしあなたが、「でも、自分の文章を書くのにどうしてもこれが必要なんだ。
to_csv
& を使用します。
to_pdf
メソッドを持っていないのですから、その前提条件がすべて間違っています。
to_html
メソッドはありませんよね?結局のところ、
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
関連
-
[解決済み】bcrypt LoadError: Cannot load such file
-
[解決済み] heroku push rejected, failed to compile Ruby/rails app
-
[解決済み] DestroyとDeleteの違い
-
[解決済み] Railsです。gemを使った特定バージョンのライブラリのアンインストール
-
[解決済み] Rails / Haml: 投稿フォームを作成するには?
-
[解決済み] バリデーションなしで属性を更新する方法
-
[解決済み] Railsはsaveでモデル内の検証をスキップしますか?
-
[解決済み] サーバーはRailsで既に稼働している
-
[解決済み] bundle install --without production は何をするのですか?
-
[解決済み】Ruby on Railsでコンソールからコントローラ/ビューヘルパーメソッドを呼び出すにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Rails。Ruby on Railsの移行でデータベースカラムの名前を変更するにはどうすればよいですか?
-
[解決済み] pg gem をインストールしようとすると 'libpq-fe.h' ヘッダが見つからない
-
[解決済み】PG::ConnectionBad: fe_sendauth: パスワードが供給されない
-
[解決済み] nil:NilClass の未定義メソッド `each'... なぜでしょうか?
-
[解決済み] Ruby on Railsのランナー
-
[解決済み] rspec 3 - クラスメソッドをスタブ化する
-
[解決済み] Oauth2 Instagram API "リダイレクトURIが登録されたリダイレクトURIと一致しない"
-
[解決済み] "render :nothing => true" は空のプレーンテキストファイルを返すのですか?
-
[解決済み] ルビーオンレール モデルから明確な値を選択する
-
[解決済み] Rails 4で、以前のバージョンのRailsでattr_accessibleを使用していた状況に遭遇した場合、Forbidden Attributes Errorが発生する。