2014-11-13 2 views
0

Я изо всех сил стараюсь найти лучший способ реализовать следующий класс в приложении Rails 4. Мне нужно использовать этот класс только в одном контроллере, и он очень длинный.Rails 4 helper class

class Yelp 
    ## 
    # Performs query on Yelp Search or Business API 
    ## 
    def query(business, term = 'lunch', cuisine = 'restaurants', limit = restaurant_limit, location = get_city) 
    # .. 
    end 

    ## 
    # Extracts a list of cuisines formatted for the view 
    # @param array of restaurant objects 
    # @return hash of cuisines 
    ## 
    def get_cuisines(restaurants) 
     # .. 
    end 

    ## 
    # Creates [non-ActiveRecord] model objects from an array of restaurant data 
    # @param array of hashes containing restaurant data 
    # @return array of objects containing restaurant data 
    ## 
    def parse_restaurants(restaurants) 
     # .. 
    end 

    ## 
    # Creates Gmaps pins from restaurant objects 
    # @param array of restaurant objects to become pins 
    # @return Gmaps pins 
    ## 
    def get_pins(restaurants) 
     # .. 
    end 
end 

Я изучил вспомогательные модули, но я понимаю, что они предназначены для логики представления.

Я не решаюсь поставить эту логику в мой application_controller.rb, потому что, как я уже сказал, я использую ее только в одном из своих контроллеров.

Я пробовал поместить этот класс в каталог lib, но не имел успеха. Я следовал this SO post, но я продолжаю получать: undefined method 'my_method' for <MainController>.

+0

Вы пробовали включить модуль в контроллер? – dandlezzz

+1

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

+0

Не делайте ваш контроллер толстым, но вместо этого проверяйте его логику и подумайте об использовании [services] (http://brewhouse.io/blog/2014/04/30/gourmet-service-objects.html) – blelump

ответ

1

Создать модуль с ActiveSupport::Concern в вашем приложение/контроллеры/проблем/ каталога, давайте назовем его yelp_searcher.rb:

module YelpSearcher 
    extend ActiveSupport::Concern 
    ## 
    # Performs query on Yelp Search or Business API 
    ## 
    def query(business, term = 'lunch', cuisine = 'restaurants', limit = restaurant_limit, location = get_city) 
    # .. 
    end 

    ## 
    # Extracts a list of cuisines formatted for the view 
    # @param array of restaurant objects 
    # @return hash of cuisines 
    ## 
    def get_cuisines(restaurants) 
    # .. 
    end 

    ## 
    # Creates [non-ActiveRecord] model objects from an array of restaurant data 
    # @param array of hashes containing restaurant data 
    # @return array of objects containing restaurant data 
    ## 
    def parse_restaurants(restaurants) 
    # .. 
    end 

    ## 
    # Creates Gmaps pins from restaurant objects 
    # @param array of restaurant objects to become pins 
    # @return Gmaps pins 
    ## 
    def get_pins(restaurants) 
    # .. 
    end 
end 

Используйте его в ThatOneController:

class ThatOneController < ApplicationController 
    include YelpSearcher 
    # more code here.. 
end 

Больше чтения на topic here.