2009-09-02 44 views
1

我有一个方法,我已经开始在多个模型中使用WebScrapping,哪里是保持它的最佳位置?我应该把它放在application_controller中,应用程序_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 

回答

1

认沽retryable.rb/

module Retryable 
    extend self 

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

使用它:

Retryable.retryable { ... } 

或包括命名空间:

include Retryable 
retryable { ... } 
3

您可以创建一个模块。从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 

而在车型:在LIB

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

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

你把它放在模型/用户而不是lib的任何特定原因? – 2009-09-02 12:23:09

+0

我不确定这是如何工作的......他们没有引用editable_by?在其他模型本身。我试着把它放在一个类似的文件夹#app/models/scrapers/retryable.rb,模块Scrapers :: Retryable中,然后引用它为“include Scrapers :: Retryable”,但它给了我“未定义的方法'retryable'Get_Data:Class “ – holden 2009-09-02 13:01:30