繁体   English   中英

Rails 3.2:如何访问帮助程序模块中的当前模型实例?

[英]Rails 3.2: How do I access the current model instance inside of a helper module?

在我的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下的PostsHelper模块中。 但是,这样做时会出现无方法错误,因为我猜对self的引用丢失了。

那么我该如何解决呢? 辅助模块是否适合这些方法?

如果我没有记错的话,辅助方法主要设计用于视图中。

我确定的是,您的辅助方法不在模型的范围内,这意味着您需要向其传递要使用的属性。 例:

  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

也许还有其他方法,但是我发现它很灵活,易于编写和维护:)

助手总是旨在帮助视图,但是,如果您希望模型干净并且将无关的方法分开保存,请尝试在Rails 3中使用关注点。默认情况下,关注目录会出现在Rails 4中。

DHH有一篇不错的博客文章。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM