web-dev-qa-db-ja.com

Rails内のモデルのヘルパーメソッド

Railsのモデルのヘルパーメソッドに適切な場所はありますか?コントローラーとビューにはヘルパーメソッドがありますが、モデルヘルパーメソッドを配置するのに最適な場所はわかりません。 ActiveRecord::Baseにメソッドを追加することは別として、私はそうしたくない。

[〜#〜] update [〜#〜]:懸念は非常に理にかなっているようです。これが私が欲しいものの例です。特定のモデルは削除できないため、常に例外をスローするコールバックを追加します。

before_destroy :nope
def nope
  raise 'Deleting not allowed'
end

心配で、私はこのようなことをすることができますか?

class MyModel < ActiveRecord::Base
  include Undeletable
end

module Undeletable
    extend ActiveSupport::Concern

    included do 
      before_destroy :nope 
    end

    def nope
      raise 'Deleting not allowed'
    end
end

これはRailsこれを行う方法ですか?

11
at.

helper_methodを使用したい場合my_helper_methodmodel内に、次のように記述できます

ApplicationController.helpers.my_helper_method

いくつかのメソッドをオーバーライドする必要がある場合など、もう少し柔軟性が必要な場合は、次のようにできます。

class HelperProxy < ActionView::Base
  include ApplicationController.master_helper_module

  def current_user
    #let helpers act like we're a guest
    nil
  end       

  def self.instance
    @instance ||= new
  end
end

そして次に

HelperProxy.instance.my_helper_method

神経が強い場合は、ApplicationController.master_helper_moduleを直接modelに挿入します。

via:makandracardsの投稿。

参考のために: http://railscasts.com/episodes/132-helpers-outside-views

19
Gagan Gami

Rails 4.2の複数のモデルで共有されているコードをどこに置くかが問題である場合、標準的な答えは懸念を使用することです: =で懸念を使用する方法Rails 4

ただし、標準のRailsモジュールが含まれていて、marek-lipkaが示唆するように拡張するだけの場合) this など、いくつかの適切な引数があります。

モデルではApplicationControllerヘルパーメソッドを使用しないことを強くお勧めします。これは、不要な手荷物を一緒にインポートするためです。これは、MVC要素を分離しておらず、アプリの相互依存関係が多すぎることを意味するため、通常、私の意見では悪臭です。

ビュー内で使用されるだけのメソッドを追加してモデルオブジェクトを変更する必要がある場合は、デコレータを確認してください。例 https://github.com/drapergem/draper

11
ReggieB