2016-05-03 5 views
0

In meiner App rails 4 habe ich einen Unterordner logic in meinem App-Ordner, wo ich Klassen/Methoden ablege, die nicht zu Controllern oder Modellen gehören.Zugriff auf die Methoden und Klassen des Unterordners

Wenn ich jedoch versuche, von einem Controller auf diese Methoden zuzugreifen, erhalte ich einen unbekannten Methodenfehler. Hier

ist eine Klasse, in der logic Ordner:

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 

Wie kann ich diese Methoden in meinem Controller zugreifen? Wenn ich nur update_context(my_message, @session) ausführen, wie ich schon sagte, bekomme ich einen unbekannten Methodenfehler.

Hier ist meine App Ordnerstruktur:

App 
Assets 
Controllers 
Logic 
    analyze.rb 
Helpers 
Mailers 
Models 
Views 

EDIT: ich hinzufügen tat: config.autoload_paths << Rails.root.join('app/logic/**/') meiner application.rb Datei.

Das ist also kein Duplikat.

+0

Mögliches Duplikat von [Wie füge ich einen neuen Ordner mit der Klasse in der Schiene hinzu?] (Http: // stackoverflow.com/questions/26406383/how-hinzufügen-new-ordner-mit-klasse-in-rails-app) –

+0

@DaveSchweisguth siehe meine bearbeiten –

+1

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

Antwort

4

Ihre update_context Methode ist eine Instanzmethode innerhalb der Klasse Analyze. Um es aufzurufen, müssen Sie Analyze.new.update_context tun.

Die Linie config.autoload_paths << Rails.root.join('app/logic/**/') Sie Rails hinzugefügt sagt, wo für Klassen und Module der Suche zu beginnen. Dies bedeutet, dass Rails in der Lage sein würde, Ihre Analyze Klasse einfach so zu finden, ohne dass Sie require 'some/path' tun müssen.

Nun scheint es, wie Sie wahrscheinlich update_context sein eine Klassenmethode, anstatt eine Instanzmethode haben wollen, so dass Sie nicht über ein Analyze Objekt mit Analyze.new instanziiert müssen. Das ist einfach genug, nur self. vor dem Methodennamen hinzufügen:

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

Analyze auch anstelle eine Klasse ein Modul in diesem Fall sein könnte, da eine „Instanz“ es wirklich scheint nicht um etwas konkretes darzustellen.

Entweder als Klasse oder Modul, wenn Sie die Methode als def self.update_context definieren, können Sie Analyze.update_context(...) von überall in Ihrer App ausführen.

Wenn Sie nach diesen Hilfsmethoden suchen, die in Ihren Ansichten verwendet werden sollen, sollten Sie in Erwägung ziehen, update_context als Methode innerhalb von app/helpers/application.helper.rb zu definieren. Definieren Sie es einfach so wie Sie es getan haben (ohne die self.) und Sie können es von jeder Ansicht aufrufen und ohne "Präfix" (d. H. Sie können einfach update_context anstelle von Analyze.update_context tun). Mit Rails können Sie auch solche Helfer von Controllern (siehe here) und Modellen (siehe here) aufrufen, obwohl es sinnvoll wäre, die Trennung von Bedenken zu berücksichtigen (View-Logik bleibt in View-Helfern, Persistenzlogik und Zugriff auf Daten in Modellen). und aktionsspezifische Business-Logik in Controllern) statt "alles in alles zu integrieren", weil es praktisch erscheint.

Verwandte Themen