2016-05-03 2 views
0

В моем приложении 4 rails у меня есть подпапка logic в папке моего приложения, где я помещаю классы/методы, которые не принадлежат контроллерам или моделям.Доступ к методам и классам подпапок

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

Вот класс в папке logic:

class Analyze   
    def intent_determination(msg, context) 
    keywords = [["categories", "category"], ["brands", "brand"], ["stock", "stocks"], ["info", "information"], ["no"], ["yes"]] 
    tokenized_array = msg.split 
    keywords.each {|array| context["intent"] = array.first if (tokenized_array & array).any? } 
    context 
    end 

    def update_context(msg, session) 
    session.update(context: intent_determination(msg, session.context)) 
    session.update(context: brand_determination(msg, session.context)) 
    session.update(context: style_determination(msg, session.context)) 
    session 
    end 
end 

Как я могу получить доступ к этим методам в своих контроллерах? Когда я только что выполнил update_context(my_message, @session), как я уже сказал, я получаю неизвестную ошибку метода.

Вот моя App структура папок:

App 
Assets 
Controllers 
Logic 
    analyze.rb 
Helpers 
Mailers 
Models 
Views 

EDIT: Я добавил: config.autoload_paths << Rails.root.join('app/logic/**/') в мой файл application.rb.

Так что это не дубликат.

+0

Возможный дубликат [Как добавить новую папку с классом в приложении rails?] (Http: // stackoverflow.com/questions/26406383/how-add-new-folder-with-class-in-rails-app) –

+0

@DaveSchweisguth см. мое редактирование –

+1

'Analyze.new.update_context (...)'? –

ответ

4

Ваш метод update_context является методом экземпляра внутри класса Analyze. Чтобы вызвать его, вы должны сделать Analyze.new.update_context.

Линия config.autoload_paths << Rails.root.join('app/logic/**/') вы добавили говорит Rails, где начать искать классов и модулей. Это означает, что Rails сможет найти ваш класс Analyze просто так, если вам не нужно делать require 'some/path'.

Теперь, кажется, что вы, вероятно, хотите иметь update_context быть метод класса, а не метод экземпляра, так что вам не нужно, чтобы создать экземпляр объекта с AnalyzeAnalyze.new. Это достаточно просто, просто добавьте self. перед именем метода:

class Analyze 
    def self.update_context(msg, session) 
    end 
end 

Analyze также может быть модуль в этом случае вместо класса, так как «экземпляр» не очень похоже представлять что-либо конкретное.

В качестве класса или модуля при определении метода как def self.update_context вы сможете сделать Analyze.update_context(...) из любого места в вашем приложении.

Если вы ищете эти вспомогательные методы, которые будут использоваться внутри ваших представлений, рассмотрите определение update_context как метода внутри app/helpers/application.helper.rb. Просто определите его, как и вы (без self.), и вы сможете назвать его с любого вида и без какого-либо «префикса» (т. Е. Вы сможете просто сделать update_context вместо Analyze.update_context). Rails также позволяет вам вызывать таких помощников из контроллеров (см. here) и моделей (см. here), хотя было бы разумно уделить внимание вопросам (логика просмотра остается в поле зрения помощников, логики настойчивости и доступа к данным в моделях, и бизнес-логика для конкретных действий в контроллерах), а не «включая все во все», потому что это кажется удобным.