[英]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.