it-swarm.com.de

NoMethodError, wenn versucht wird, die Hilfemethode vom Rails-Controller aufzurufen

Beim Versuch, auf eine in einem meiner Hilfsmodule definierte Methode zuzugreifen, erhalte ich eine NoMethodError von einer meiner Controller-Klassen. Meine Rails-Anwendung verwendet die Klassenmethode helper mit dem Symbol :all (siehe unten):

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, sodass alle Methoden in die Controller eingemischt werden. Ist das richtig?

Wenn ich das Hilfsmodul innerhalb der Steuerung explizit include, dann funktioniert alles richtig.

71
John Topley

helper :all stellt alle Helfer (ja, alle) in den Ansichten zur Verfügung. Sie werden nicht in die Steuerung aufgenommen.

Wenn Sie Code zwischen Helfer und Controller freigeben möchten, was nicht sehr wünschenswert ist, da Helper UI-Code und Controller Controller-Code ist, können Sie entweder den Helfer in den Controller einbinden oder ein separates Modul erstellen und diesen in einfügen der Controller und der Helfer.

49
Honza

So verwenden Sie die Hilfsmethoden, die bereits in der Vorlagen-Engine enthalten sind:

  • Schienen 2: Verwenden Sie die Variable @template
  • Rails 3: hat die Nice-Controller-Methode view_context

Beispiel für den Aufruf 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
133
gamecreature

wenn Sie eine Methode zwischen einem Controller und einem Helper/View teilen möchten, können Sie 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

30
ben

Hilfsmethoden von Controllern

Eine Möglichkeit, an Ihre Hilfsmethoden zu gelangen, besteht einfach darin, Ihre Hilfsdatei einzuschließen.

include LoginHelper
cool_login_helper_method(x,y,z)

Dadurch werden alle Methoden dieses Hilfsmoduls in Ihren Controller übernommen. Das ist nicht immer eine gute Sache. Um den Bereich getrennt zu halten, erstellen Sie ein Objekt, versehen Sie es mit den Fähigkeiten dieses Helpers und verwenden Sie es, um die Methoden aufzurufen:

login_helper = Object.new.extend(LoginHelper)
login_helper.cool_login_helper_method(x,y,z)

Helfer: alle

helper :all macht alle Ihre Helper-Methoden aus allen Helper-Modulen für alle Ihre views verfügbar, tut aber nichts für Ihre Controller. Dies ist darauf zurückzuführen, dass Hilfemethoden für die Verwendung in Ansichten konzipiert sind und normalerweise nicht von Controllern aus darauf zugegriffen werden sollte. In neueren Versionen von Rails ist diese Option standardmäßig für jeden Controller aktiviert.

28
Adrian Dunston

Verwenden Sie für Rails 3 die view_context-Methode in Ihrem Controller:

def foo
  view_context.helper_method
  ...

Beispiel: http://www.christopherirish.com/2011/10/13/no-view_context-in-Rails-3-1-changes/

7
B Seven

Es ist wahrscheinlich sauberer, die Methode helpers zu verwenden:

class FooController < ActionController::Base
  def action
    self.class.helpers.helper_method arg
  end
end
5

Die Zeit, zu der ich dies am meisten brauche, ist das Schreiben des Flashs oder von benutzerdefinierten Fehlerprüfgeräten. Es ist schön, unter Umständen Dinge wie link_to-Helfer in der Flash-Nachricht zu verwenden. Ich verwende die folgende Lösung, um ActionView-Helfer in den Controller zu bekommen. Beachten Sie, dass dies, wie oben erwähnt, die Trennung von MVC durchbricht. Wenn also jemand anderes eine bessere Idee hat, lassen Sie es mich wissen!

Unter ApplicationController fügen Sie Folgendes hinzu:

class Something
  include Singleton
  include ActionView::Helpers::UrlHelper
end

und im ApplicationController hinzufügen

def foo
  Something.instance
end

und schließlich im Controller, auf den Sie auf den Hilfscode zugreifen möchten:

messages << "<li class='error'>Your have an Error!<%= foo.link_to('Fix This', some_path) %></li>"

Hoffe das hilft irgendwie!

5
Scott Miller

Auf jeden Helfer kann mit der Variable @template im Controller zugegriffen werden.

@ template.my_super_helper

4
BitOfUniverse

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

3
Nitin

Helfer sollen mit Vorlagen verwendet werden, dh. Ansichten, nicht in Controllern. Deshalb können Sie nicht auf die Methode zugreifen. Wenn Sie eine Methode zwischen zwei Controllern teilen möchten, müssen Sie sie beispielsweise in ApplicationController definieren. helper: Alle besagen, dass jede Methode, die Sie in einer Hilfedatei im Verzeichnis app/helpers definieren, für jede Vorlage verfügbar ist.

2
Milan Novota

Es gibt zwei Möglichkeiten, dies zu tun: Entweder um ein Modul zu erstellen oder die Variable @template zu verwenden. Weitere Informationen finden Sie hier http://www.shanison.com/?p=305

1
Shanison

Wenn Sie Ihre Datei application_controller.rb in diese Datei ändern ...

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  include SessionsHelper
end

... dann stehen alle Helfer allen Controllern zur Verfügung.

0
I_do_python

Wenn sich nur ApplicationHelper in Ihrem app/helpers-Ordner befindet, müssen Sie ihn mit include ApplicationHelper in Ihren Controller laden. Standardmäßig lädt Rails nur das Hilfsmodul, das denselben Namen wie Ihr Controller hat. (Der ArtikelController lädt beispielsweise den ArtikelHelper). Wenn Sie über viele Modelle verfügen (z. B. Artikel, Beiträge, Kategorien), müssen Sie jedes Modell in Ihren Controller hochladen. die Dokumente

Helfer

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