【问题标题】:Where is a good place for a commonly used method... in rails哪里是一个常用方法的好地方......在rails中
【发布时间】:2009-09-02 10:51:51
【问题描述】:

我有一种方法已开始在多个模型中用于 Webscraping,保存它的最佳位置在哪里?我应该把它放在application_controller,application_helper中吗?不知道放在哪里好让多个模型使用?

  def self.retryable(options = {}, &block)
    opts = { :tries => 1, :on => Exception }.merge(options)

    retry_exception, retries = opts[:on], opts[:tries]

    begin
      return yield
    rescue retry_exception
      retry if (retries -= 1) > 0
    end

    yield
  end

【问题讨论】:

    标签: ruby-on-rails ruby model helper


    【解决方案1】:

    您可以创建一个模块。来自Altered Beast 项目的示例:(我经常在其他项目中查看它们如何解决特定问题)

    # app/models/user/editable.rb
    module User::Editable
      def editable_by?(user, is_moderator = nil)
        is_moderator = user.moderator_of?(forum) if is_moderator.nil?
        user && (user.id == user_id || is_moderator)
      end
    end
    

    在模型中:

    # app/models/post.rb
    class Post < ActiveRecord::Base
      include User::Editable
      # ...
    end
    
    # app/models/topic.rb
    class Topic < ActiveRecord::Base
      include User::Editable
      # ...
    end
    

    【讨论】:

    • 你把它放在models/user而不是lib中有什么特别的原因吗?
    • 我不确定它是如何工作的......他们没有引用editable_by?在其他模型本身。我尝试将我的放在一个类似的文件夹#app/models/scrapers/retryable.rb,模块 Scrapers::Retryable 中,然后将其引用为“包含 Scrapers::Retryable”,但它给了我“Get_Data:Class 的未定义方法 `retryable' "
    【解决方案2】:

    将 retryable.rb 放入 lib/

    module Retryable
      extend self
    
      def retryable(options = {}, &block) # no self required
      ...
      end
    end
    

    使用它:

    Retryable.retryable { ... }
    

    或包括命名空间:

    include Retryable
    retryable { ... }
    

    【讨论】:

      猜你喜欢
      • 2010-09-12
      • 2011-02-22
      • 1970-01-01
      • 1970-01-01
      • 2013-11-05
      • 2011-02-22
      • 1970-01-01
      • 2012-02-28
      • 2012-05-06
      相关资源
      最近更新 更多