Schienen - Verwendung eines Helfers in einem Controller


207

Während mir klar ist, dass Sie einen Helfer in einer Ansicht verwenden sollen, benötige ich einen Helfer in meinem Controller, wenn ich ein JSON-Objekt erstelle, um zurückzukehren.

Es geht ein bisschen so:

def xxxxx

   @comments = Array.new

   @c_comments.each do |comment|
   @comments << {
     :id => comment.id,
     :content => html_format(comment.content)
   }
   end

   render :json => @comments
end

Wie kann ich auf meinen html_formatHelfer zugreifen ?


2
Vielleicht möchten Sie die Antwort von @ Grosser berücksichtigen, sie ist viel vollständiger.
Tokland

Ich weiß, das ist alt, aber ... was ist los mit einfachen Rubinklassen? : p
Tarek

Antworten:


205

Hinweis: Dies wurde 2 Tage in den Rails geschrieben und akzeptiert. Heutzutage ist die Antwort von Grosser der richtige Weg.

Option 1: Der wahrscheinlich einfachste Weg besteht darin, Ihr Hilfsmodul in Ihre Steuerung aufzunehmen:

class MyController < ApplicationController
  include MyHelper

  def xxxx
    @comments = []
    Comment.find_each do |comment|
      @comments << {:id => comment.id, :html => html_format(comment.content)}
    end
  end
end

Option 2: Oder Sie können die Hilfsmethode als Klassenfunktion deklarieren und wie folgt verwenden:

MyHelper.html_format(comment.content)

Wenn Sie es sowohl als Instanzfunktion als auch als Klassenfunktion verwenden möchten, können Sie beide Versionen in Ihrem Helfer deklarieren:

module MyHelper
  def self.html_format(str)
    process(str)
  end

  def html_format(str)
    MyHelper.html_format(str)
  end
end

Hoffe das hilft!


Danke, aber ich bin etwas verwirrt. Im Moment befindet sich mein Helfer in /app/helpers/application_helper.rb ... Und Sie schlagen vor, den Helfer auf ApplicationController zu verschieben?
AnApprentice

Ich habe 'include ApplicationHelper' zu meinem application_controller hinzugefügt, aber dieser Fehler mit 'NoMethodError (undefinierte Methode' html_format 'für ApplicationHelper: Module):'
AnApprentice

1
@AnApprentice Sieht so aus, als hätten Sie es herausgefunden, aber ich habe meine Antwort ein wenig optimiert, um die Dinge hoffentlich klarer zu machen. In der ersten Version können Sie nur verwenden html_format- Sie brauchen nur MyHelper.html_formatin der zweiten.
Xavier Holt

4
Dies funktioniert nicht, wenn die Hilfsmethode, die Sie verwenden möchten, Ansichtsmethoden wie z link_to. Controller haben keinen Zugriff auf diese Methoden und die meisten meiner Helfer verwenden diese Methoden. Wenn Sie den Helfer in den Controller aufnehmen, werden alle Methoden des Helfers als öffentlich zugängliche Aktionen angezeigt, was nicht gut ist. view_contextist der Weg in Rails 3.
GregT

@ GregT - Hatte die Antwort von Grosser noch nie gesehen, da sie etwas später kam, aber ich mag sie auch besser. Er hat gerade meine Gegenstimme bekommen.
Xavier Holt

303

Sie können verwenden

  • helpers.<helper>in Rails 5+ (oder ActionController::Base.helpers.<helper>)
  • view_context.<helper>( Rails 4 & 3 ) (WARNUNG: Dadurch wird pro Aufruf eine neue Ansichtsinstanz instanziiert.)
  • @template.<helper>( Schienen 2 )
  • Helfer in eine Singleton-Klasse aufnehmen und dann singleton.helper
  • include der Helfer in der Steuerung (WARNUNG: Alle Hilfsmethoden werden in Steuerungsaktionen umgewandelt.)

56
Diese Antwort ist noch besser! In Rails 3 ist das einfache Anrufen view_context.helper_functioneinfach und funktioniert hervorragend. ActionController::Base.helpers.helper_functionist genauso gut.
Trisweb

29
view_context= Genie
n_i_c_k

5
WARNUNG: Nicht verwenden view_context. Es wird eine neue Ansichtsinstanz pro Aufruf instanziiert ...
fny

7
ActionController::Base.helpers.helper_functionscheint nicht zu funktionieren. Ich bekomme NoMethodError - undefined method spell_date_and_time' for #<ActionView::Base:0x007fede56102d0>:beim Versuch ActionController::Base.helpers.spell_date_and_time()eine Controller-Methode aufzurufen . Anruf view_context.spell_date_and_time()funktioniert jedoch.
Wels

37
Schienen 5: einfach helpers.helper_functionin Ihrem Controller verwenden ( github.com/rails/rails/pull/24866 )
Markus

80

Verwenden Sie helpers.helper_functionin Rails 5 die in Ihrem Controller.

Beispiel:

def update
  # ...
  redirect_to root_url, notice: "Updated #{helpers.pluralize(count, 'record')}"
end

Quelle: Aus einem Kommentar von @Markus zu einer anderen Antwort. Ich hatte das Gefühl, dass seine Antwort eine eigene Antwort verdient, da sie die sauberste und einfachere Lösung ist.

Referenz: https://github.com/rails/rails/pull/24866


6
Es fühlt sich ein bisschen komisch an, dass man in der Konsole helperSingular und im Controller Plural nennt .
Fellow Stranger

10

Mein Problem wurde mit Option 1 behoben. Der wahrscheinlich einfachste Weg besteht darin, Ihr Hilfsmodul in Ihren Controller aufzunehmen:

class ApplicationController < ActionController::Base
  include ApplicationHelper

...

1
Einziger Nachteil ist, dass Controller-Aktionen mit dem Namen der Hilfsfunktionen hinzugefügt werden. Aber tbh, das mache ich auch :)
Felix

9

Wenn der Helfer in (nur) Controllern verwendet werden soll, deklariere ich ihn im Allgemeinen lieber als Instanzmethode von class ApplicationController.


5
Als geschützte Methode
Benjamin Crouzier

3

In Rails 5+ können Sie einfach die unten gezeigte Funktion mit einem einfachen Beispiel verwenden:

module ApplicationHelper
  # format datetime in the format #2018-12-01 12:12 PM
  def datetime_format(datetime = nil)
    if datetime
      datetime.strftime('%Y-%m-%d %H:%M %p')
    else
      'NA'
    end
  end
end

class ExamplesController < ApplicationController
  def index
    current_datetime = helpers.datetime_format DateTime.now
    raise current_datetime.inspect
  end
end

AUSGABE

"2018-12-10 01:01 AM"

0
class MyController < ApplicationController
    # include your helper
    include MyHelper
    # or Rails helper
    include ActionView::Helpers::NumberHelper

    def my_action
      price = number_to_currency(10000)
    end
end

Verwenden Sie in Rails 5+ einfach Helfer ( helpers.number_to_currency (10000) ).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.