0

私の Rails モデルPost.rbでは、次のメソッドをセットアップしています。

  def category_names(seperator = ", ")
    categories.map(&:name).flatten.join(seperator).titleize
  end

  def publish_date
    read_attribute(:publish_date).strftime('%A, %b %d')
  end

PostsHelperこれらをヘルパーの下のモジュールに移動したいと思います。selfしかし、参照が失われていると思われるため、そうするとメソッドなしエラーが発生します。

では、どうすればこれを修正できますか?ヘルパー モジュールは、これらのメソッドの不適切な場所ですか?

4

2 に答える 2

2

間違っていなければ、ヘルパー メソッドは主にビューで使用するように設計されています。

私が確信しているのは、ヘルパー メソッドがモデルの範囲外にあることです。つまり、操作する属性をそれらに渡す必要があります。例:

  def category_names(categories, seperator = ", ")
    categories.map(&:name).flatten.join(seperator).titleize
  end

そしてあなたのビューを呼び出します:

category_names @post.categories

ビューで排他的に使用されていない自作の「ヘルパー」メソッドを見つけた場合は、サービス オブジェクトを作成してモデルに含めることができます。

編集:サービスオブジェクト

「app」ディレクトリの下に「services」ディレクトリを作成し、そこにクラスを作成できます。

例を挙げましょう。User モデル クラスを取得しました。パスワードに関連するすべてのメソッドを UserPassword サービス オブジェクトにグループ化したいと考えています。

ユーザークラス:

class User < ActiveRecord::Base
  include ::UserPassword
  ...
end

UserPassword サービス オブジェクト:

require 'bcrypt'

module UserPassword
  def encrypt_password
    if password.present?
      self.password_salt = BCrypt::Engine.generate_salt
      self.password_hash = BCrypt::Engine.hash_secret(password, password_salt)
    end
  end

  module ClassMethods
    def authenticate(email, password)
      user = find_by_email email
      if user and user.password_hash == BCrypt::Engine.hash_secret(password, user.password_salt)
        user
      end
    end
  end

  def self.included(base)
    base.extend(ClassMethods)
  end
end

したがって、私の Userインスタンス化されたオブジェクト(つまりu = User.first) は を呼び出すことができu.encrypt_password、私の Userクラスは を呼び出すことができますUser.authenticate

他の方法があるかもしれませんが、私はそれが柔軟で、書きやすく、維持しやすいと思います:)

于 2013-03-04T10:33:59.907 に答える
1

ヘルパーは常にビューを支援することを目的としていますが、モデルをクリーンにし、無関係なメソッドを個別に保持する場合は、Rails3で懸念事項を使用してみてください。懸念事項ディレクトリはデフォルトでRails4に存在します。

同じためにDHHによる素晴らしいブログ投稿があります。

http://37signals.com/svn/posts/3372-put-chubby-models-on-a-diet-with-concerns

于 2013-03-04T10:55:06.493 に答える