Rails相当新,遇到了一个我似乎无法弄清楚的问题。
我有2个型号,User&帖子。用户将具有“名称”属性,帖子将具有“标题”属性。
在这两种情况下,我还想维护一个slug,它将在before_save上将相应的列转换为“sluggified”版本并将其存储为slug。我已经掌握了我想要的逻辑并且已经有了这个工作,但是,我想把这个行为抽象为一个关注点。
我似乎无法找到一种方法来设置它 - 主要是因为源字段的动态特性。我希望能够做到以下几点:
class User < ActiveRecord::Base
include Sluggable
act_as_slug :name
end
class Post < ActiveRecord::Base
include Sluggable
act_as_slug :title
end
不幸的是,无论我尝试过如何实施这个问题,我都遇到了问题。
虽然我想知道哪种类型的实现方式可行,但我也有兴趣听听这是否是一个关注的好用例?
答案 0 :(得分:3)
这似乎有效,如果其他人正在寻找答案(肯定会向那些有更多经验的人提供更好的建议)。模型看起来像原始帖子中建议的那样。
module Sluggable
extend ActiveSupport::Concern
included do
before_save :generate_slug
class_attribute :sluggable_attribute
def generate_slug
self.sluggify(self.class.sluggable_attribute)
end
def sluggify(attribute)
# Sluggify logic goes here
end
end
module ClassMethods
def acts_as_slug(value)
self.sluggable_attribute = value
end
end
end