Ich bin immer ein , NoMethodError
wenn versucht wird, ein Verfahren in einem meiner Helfer - Module von einem meiner Controller - Klassen definiert zuzugreifen. Meine Rails-Anwendung verwendet die helper
Klassenmethode mit dem folgenden :all
Symbol:
class ApplicationController < ActionController::Base
helper :all
.
.
end
Ich verstehe, dass dies dazu führen sollte, dass alle meine Controller-Klassen automatisch alle Hilfsmodule im Verzeichnis app / helpers enthalten und daher alle Methoden in die Controller einmischen. Ist das richtig?
Wenn ich explizit include
das Hilfsmodul in der Steuerung habe, dann funktioniert alles richtig.
ruby-on-rails
ruby
John Topley
quelle
quelle
Antworten:
helper :all
stellt alle Helfer (ja, alle) in den Ansichten zur Verfügung, schließt sie nicht in den Controller ein.Wenn Sie einen Code zwischen Helfer und Controller freigeben möchten, was nicht sehr wünschenswert ist, da Helfer UI-Code und Controller Controller-Code ist, können Sie entweder den Helfer in den Controller aufnehmen oder ein separates Modul erstellen und diesen einbinden der Controller und der Helfer.
quelle
So verwenden Sie die bereits in der Vorlagen-Engine enthaltenen Hilfsmethoden:
@template
Variable.view_context
Beispiel für die Verwendung des Aufrufs von 'number_to_currency' in einer Controller-Methode:
# rails 3 sample def controller_action @price = view_context.number_to_currency( 42.0 ) end # rails 2 sample def controller_action @price = @template.number_to_currency( 42.0 ) end
quelle
view_context
.Wenn Sie eine Methode zwischen einem Controller und einem Helfer / einer Ansicht freigeben müssen, können Sie diese einfach über 'helper_method' oben im Controller definieren:
class ApplicationController < ActionController::Base helper_method :my_shared_method ... def my_shared_method #do stuff end end
hoffentlich hilft das
quelle
helper_method :my_shared_method
muss nicht "oben" sein. Sie kann überall hingehen und gefällt mir am besten direkt über der Definition (def my_shared_method
).Hilfsmethoden von Controllern
Eine Möglichkeit, an Ihre Hilfsmethoden heranzukommen, besteht darin, einfach Ihre Hilfsdatei einzuschließen.
include LoginHelper cool_login_helper_method(x,y,z)
Dadurch werden alle Methoden dieses Hilfsmoduls in Ihrem Controller berücksichtigt. Das ist nicht immer gut. Um den Bereich getrennt zu halten, erstellen Sie ein Objekt, geben Sie ihm die Fähigkeiten dieses Helfers und rufen Sie damit die folgenden Methoden auf:
Helfer: alle
helper :all
stellt alle Ihre Hilfsmethoden aus all Ihren Hilfsmodulen für alle Ihre Ansichten zur Verfügung , tut jedoch nichts für Ihre Controller. Dies liegt daran, dass Hilfsmethoden für die Verwendung in Ansichten entwickelt wurden und im Allgemeinen nicht von Controllern aus aufgerufen werden sollten. In neueren Versionen von Rails ist diese Option standardmäßig immer für jeden Controller aktiviert.quelle
Verwenden Sie für Rails 3 die
view_context
Methode in Ihrem Controller:def foo view_context.helper_method ...
Hier ein Beispiel: http://www.christopherirish.com/2011/10/13/no-view_context-in-rails-3-1-changes/
quelle
Die Zeit, in der dies am dringendsten benötigt wird, ist das Schreiben des Flashs oder der benutzerdefinierten Fehlerprüfungen. Unter bestimmten Umständen ist es schön, Dinge wie link_to-Helfer in der Flash-Nachricht zu verwenden. Ich verwende die folgende Lösung, um ActionView-Helfer in den Controller zu integrieren. Beachten Sie, dass dies, wie oben erwähnt, die MVC-Trennung unterbricht. Wenn also jemand eine bessere Idee hat, lassen Sie es mich wissen!
Fügen Sie unter ApplicationController Folgendes hinzu:
class Something include Singleton include ActionView::Helpers::UrlHelper end
und fügen Sie im ApplicationController hinzu
def foo Something.instance end
und schließlich in der Steuerung, in der Sie auf den Hilfecode zugreifen möchten:
messages << "<li class='error'>Your have an Error!<%= foo.link_to('Fix This', some_path) %></li>"
Hoffe das hilft irgendwie!
quelle
Es ist wahrscheinlich sauberer, die Hilfsmethode zu verwenden:
class FooController < ActionController::Base def action self.class.helpers.helper_method arg end end
quelle
Auf jeden Helfer kann mit der Variablen @template im Controller zugegriffen werden.
quelle
Der Controller kann nicht automatisch auf Hilfsmethoden zugreifen. Wir müssen sie in den App-Controller aufnehmen.
Modul ApplicationHelper
def hello_message "Hello World" end
Ende
Klasse ApplicationController <ActionController :: Base
include ApplicationHelper def message hello_message end
Ende
quelle
Helfer sind mit Vorlagen zu verwenden, dh. Ansichten, nicht in Controllern. Deshalb können Sie nicht auf die Methode zugreifen. Wenn Sie eine Methode für zwei Controller freigeben möchten, müssen Sie sie beispielsweise in ApplicationController definieren. helper: Alle sagen, dass jede Methode, die Sie in einer Hilfedatei im Verzeichnis app / helpers definieren, für jede Vorlage verfügbar ist.
quelle
Es gibt zwei Möglichkeiten, dies zu tun: entweder um ein Modul zu erstellen oder die Variable @template zu verwenden. Weitere Informationen finden Sie unter http://www.shanison.com/?p=305
quelle
Wenn Sie Ihre Datei application_controller.rb in diese ändern ...
class ApplicationController < ActionController::Base protect_from_forgery with: :exception include SessionsHelper end
... dann stehen alle Helfer allen Controllern zur Verfügung.
quelle
Wenn Sie nur ApplicationHelper in Ihrem
app/helpers
Ordner haben, müssen Sie es mit in Ihren Controller ladeninclude ApplicationHelper
. Standardmäßig lädt Rails nur das Hilfsmodul, das denselben Namen wie Ihr Controller hat. (zB ArticlesController lädt ArticlesHelper). Wenn Sie viele Modelle haben (z. B. Artikel, Beiträge, Kategorien), müssen Sie jedes Modell in Ihren Controller hochladen. die docsHelfer
module PostsHelper def find_category(number) return 'kayak-#{number}' end def find_other_sport(number) "basketball" #specifying 'return' is optional in ruby end end module ApplicationHelper def check_this_sentence 'hello world' end end
Beispiel Controller
class ArticlesController < ApplicationController include ApplicationHelper include PostsHelper #...and so on... def show#rails 4.1.5 #here I'm using the helper from PostsHelper to use in a Breadcrumb for the view add_breadcrumb find_other_sport(@articles.type_activite), articles_path, :title => "Back to the Index" #add_breadcrumb is from a gem ... respond_with(@articles) end end
quelle
Bitte versuchen Sie es
include SessionsHelper
in ApplicationControllerclass ApplicationController < ActionController::Base include SessionsHelper ... end
quelle