2016-04-03 4 views
0

Ниже приведен мой прецедент -Rails - Куда должны идти помощники контроллера?

У меня есть метод контроллера (действия), который вызывает вызов API в Google. Я создал класс Google, который я установил в папку lib. Класс Google предоставляет метод вызова api.

def self.list_items(folder_id, access_token) 
    result = RestClient.get "#{API_URL}/drive/v2/files", 
          { 
           :Authorization => "Bearer #{access_token}", 
           :params => {:q => "'#{folder_id}' in parents and trashed=false"} 
          } 
    return JSON.parse(result)['items'] 
    end 

Однако, мне нужно написать метод, который вызывает list_items из Google, перехватывает исключение в случае истекающий access_token, освежает access_token, сохраняет новую access_token в базе данных и делает list_items вызов снова.

Поскольку этот метод требует взаимодействия с базой данных, я не хочу помещать его в класс в lib. Я новичок в рельсах, и я понял, что папка lib должна иметь сторонний код. Класс Google здесь может рассматриваться как сторонний класс как его PORO, не имеющий ничего общего с проектом rails или моей бизнес-логикой. Пожалуйста, исправьте меня, если это понимание неверно.

Я могу сохранить этот метод как частный метод в контроллере, но предположим, что существует несколько таких методов. Разве это не сделает контроллер толстым?

Кроме того, контроллер FileApiController, тогда как все эти методы являются специфическими для Google. У меня также есть методы, специфичные для box и dropbox. В идеале я бы хотел создать классы GoogleHelper, DropboxHelper и т. Д., Которые также взаимодействуют с db. Где сохранить эти классы?

Я прихожу из фона Grails, и GoogleHelper, как правило, делается в качестве службы в Grails, например googleService. Что это за рельсы. В частности, если я делаю класс GoogleHelper, где его сохранить? Полагаю, вспомогательная папка предназначена только для того, чтобы сохранять помощники вида.

ответ

2

Создать файл в app/helpers/google_helper.rb

module GoogleHelper 

class << self 

    def print_hello 
    puts 'HELLO WORLD' 
    end  


    def list_items(folder_id, access_token) 
    result = RestClient.get "#{API_URL}/drive/v2/files", 
          { 
           :Authorization => "Bearer #{access_token}", 
           :params => {:q => "'#{folder_id}' in parents and trashed=false"} 
          } 
    return JSON.parse(result)['items'] 
    end 
end 
end 

Если вы хотите вызвать GoogleHelper в контроллерах затем добавить его в application_controller.rb это include GoogleHelper

Теперь вы можете вызвать помощник: GoogleHelper.print_hello в контроллере.

+0

Вы можете удалить код внутри list_items, поскольку вместо этого я буду называть 'Google.list_items'. Ваше решение кажется хорошим, но я думал, что классы под папкой помощников в основном предназначены для помощника вида. является ли распространенной практикой держать помощников контроллера под папкой помощников? – vishesh

+0

Да, его хорошая практика, использовать помощники для контроллеров и просмотра. – 7urkm3n

+0

Кроме того, вы также можете вызвать Helpers 'GoogleHelper.print_hello' в файлах MODEL. – 7urkm3n

Смежные вопросы