将模型方法移动到帮助器

时间:2013-04-18 14:18:35

标签: ruby-on-rails-3 helper

我有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

2 个答案:

答案 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)

两种干燥代码的方法。

方法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

方法2:扩展ActiveRecord

# 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