我有3个模型使用相同的方法。为了保持干燥,我想把它们转移到辅助方法,但不知道如何使它成为全局但仍然从模型中获得。
目前我在3个模型中有format_slug
。
class Page < ActiveRecord::Base
before_save :format_slug
def format_slug
slug.parameterize.downcase
end
end
如何将format_slug
移动到application_helper并在模型中过滤之前调用方法?
module ApplicationHelper
def format_slug(model)
model.slug.parameterize.downcase
end
end
class Page < ActiveRecord::Base
before_save :format_slug
end
答案 0 :(得分:2)
您不希望使用帮助,但可以使用其他模块。视图中使用了助手,这种情况仅在您的模型中发生。
这是一个很受关注的候选人,你可以在这里找到更多相关信息 https://gist.github.com/dhh/1014971
(这可能在lib / sluggable.rb或app / models / concerns / sluggable.rb中)后者在Rails 4中是标准的,但一定要调整你的负载路径。
module Sluggable
extend ActiveSupport::Concern
included do
before_save :format_slug
end
def format_slug
slug.parameterize.downcase
end
end
然后在您想要使用它的模型中:
class Page < ActiveRecord::Base
include Sluggable
end
答案 1 :(得分:1)
两种干燥代码的方法。
module ApplicationHelper
def format_slug(str)
str.parameterize.downcase
end
end
class Page < ActiveRecord::Base
before_save :handle_slug
def handle_slug
format_slug self.slug
end
end
# lib/my_ar_extension.rb
module MyArExtension
def format_slug
self.slug.parameterize.downcase if self.slug
end
end
ActiveRecord::base.send :include, MyArExtension
# Page model
class Page < ActiveRecord::Base
attr_accessible :slug # and others
before_filter :format_slug
# other code
end