2009-09-02 3 views
1

У меня есть метод, который я начал использовать в нескольких моделях для Webscrapping, где это лучшее место для его хранения? Должен ли я помещать его в application_controller, приложение _helper? Я не уверен, где выгодно использовать его для нескольких моделей?Где хорошее место для общепринятого метода ... в rails

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 в Lib/

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 

И в моделях:

# 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? –

+0

Я не уверен, как это работает ... они не ссылаются на editable_by? в других моделях. Я попытался разместить шахту в аналогичной папке # app/models/scrapers/retryable.rb, модуль Scrapers :: Retryable, а затем ссылаясь на него как на «включить скребки :: Retryable», но он дает мне «неопределенный метод' retryable »для Get_Data: Class " – holden