【问题标题】:Move model method to helper将模型方法移动到助手
【发布时间】:2013-04-18 14:18:35
【问题描述】:

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

目前我在 3 个型号中有 format_slug

class Page < ActiveRecord::Base
  before_save :format_slug

  def format_slug
    slug.parameterize.downcase
  end
end

如何将format_slug移动到application_helper并通过model中的filter前调用方法?

module ApplicationHelper
  def format_slug(model)
    model.slug.parameterize.downcase
  end
end

class Page < ActiveRecord::Base
  before_save :format_slug
end

【问题讨论】:

    标签: ruby-on-rails-3 helper


    【解决方案1】:

    您不想使用 helper,但可以使用另一个 module。视图中使用了助手,而这仅在您的模型中发生。

    这是一个很好的关注点,您可以在此处找到更多相关信息 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
    

    【讨论】:

    • 感谢 @shawn-balesstracci 是时候习惯 Rails 4 标准了
    【解决方案2】:

    干燥代码的两种方法。

    方法一:使用助手

    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
    

    【讨论】:

    • 谢谢@billy-chan 我会保存它以备后用。现在我要使用关注点。
    猜你喜欢
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多