1

我有 3 个使用相同方法的模型。为了保持干燥,我想将这些移至辅助方法,但不确定如何使其成为全局但仍从模型接收。

目前我有format_slug3 种型号。

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
4

2 回答 2

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
于 2013-04-18T15:27:41.633 回答
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

方法二:扩展 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
于 2013-04-18T14:43:14.747 回答