wake-up-neo.com

Rails - So verwenden Sie einen Helfer in einem Controller

ich weiß zwar, dass Sie einen Helfer in einer Ansicht verwenden sollen, aber ich brauche einen Helfer in meinem Controller, da ich ein JSON-Objekt zum Erstellen von Objekten konstruiere.

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_format-Helfer zugreifen?

184
AnApprentice

Hinweis: Dies wurde vor 2 Tagen in den Rails geschrieben und akzeptiert; Heutzutage ist die Antwort von Grosser (unten) der richtige Weg.

Option 1: Die einfachste Möglichkeit ist, 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 als Instanz- und Klassenfunktion verwenden möchten, können Sie beide Versionen in Ihrem Helper deklarieren:

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

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

Hoffe das hilft!

191
Xavier Holt

Sie können verwenden 

  • @Vorlage. (Schienen 2) 
  • view_context. (Rails 3) (WARNUNG: Dadurch wird pro Aufruf eine neue Ansichtsinstanz instanziiert.)
  • ActionController :: Base.helpers
  • fügen Sie Helper in eine Singleton-Klasse und dann in singleton.helper ein
  • den Helfer in den Controller aufnehmen (WARNUNG: Alle Helper-Methoden werden in Controller-Aktionen umgewandelt)
265
grosser

In Rails 5 verwenden Sie den helpers.helper_function in Ihrer Steuerung.

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 es verdient hatte, da es die sauberste und einfachere Lösung ist.

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

73
Gerry Shaw

Mein Problem wurde mit Option 1 gelöst. Die einfachste Möglichkeit besteht darin, Ihr Hilfsmodul in Ihren Controller aufzunehmen:

class ApplicationController < ActionController::Base
  include ApplicationHelper

...
10

Wenn der Helfer in (nur) Controllern verwendet werden soll, bevorzuge ich es als Instanzmethode von class ApplicationController.

9
Franco

In Rails 5+ können Sie die Funktion wie folgt 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
Ravistm
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+ helpers ( helpers.number_to_currency (10000) )

0
albertm