Rotaie - Come utilizzare un assistente all'interno di un controller


207

mentre mi rendo conto che dovresti usare un aiutante all'interno di una vista, ho bisogno di un aiutante nel mio controller mentre sto costruendo un oggetto JSON per tornare.

Va un po 'così:

def xxxxx

   @comments = Array.new

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

   render :json => @comments
end

come posso accedere al mio html_formataiutante?


2
potresti prendere in considerazione la risposta di @ grosser, è molto più completa.
tokland,

So che questo è vecchio ma ... cosa c'è che non va nelle lezioni di rubino? : p
Tarek,

Risposte:


205

Nota: questo è stato scritto e accettato nei Rails 2 giorni; oggi la risposta di Grosser è la strada da percorrere.

Opzione 1: probabilmente il modo più semplice è includere il tuo modulo di supporto nel controller:

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

Opzione 2: oppure puoi dichiarare il metodo helper come una funzione di classe e usarlo in questo modo:

MyHelper.html_format(comment.content)

Se vuoi essere in grado di usarlo sia come funzione di istanza che come funzione di classe, puoi dichiarare entrambe le versioni nel tuo helper:

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

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

Spero che questo ti aiuti!


Grazie ma sono un po 'confuso. In questo momento il mio aiutante è in /app/helpers/application_helper.rb ... E stai suggerendo che dovrei spostare l'helper su ApplicationController?
AnApprentice,

Ho aggiunto 'include ApplicationHelper' al mio application_controller ma che errori con 'NoMethodError (metodo indefinito `html_format' per ApplicationHelper: Module): '
AnApprentice,

1
@AnApprentice Sembra che tu l'abbia capito, ma ho modificato un po 'la mia risposta, sperando di chiarire le cose. Nella prima versione, puoi semplicemente usare html_format- hai solo bisogno MyHelper.html_formatnella seconda.
Xavier Holt,

4
Questo non funziona quando il metodo di supporto che si desidera utilizzare utilizza metodi di visualizzazione come link_to. I controller non hanno accesso a questi metodi e la maggior parte dei miei helper utilizza questi metodi. Inoltre, includere l'helper nel controller espone tutti i metodi dell'helper come azioni accessibili al pubblico che non vanno bene. view_contextè la strada da percorrere in Rails 3.
GregT

@GregT - Non avevo mai visto prima la risposta di Grosser, dato che è arrivata un po 'dopo il fatto, ma mi piace anche di più. Ha appena ottenuto il mio voto.
Xavier Holt,

304

Puoi usare

  • helpers.<helper>in Rails 5+ (o ActionController::Base.helpers.<helper>)
  • view_context.<helper>( Rails 4 & 3 ) (ATTENZIONE: questo crea un'istanza di una nuova vista per chiamata)
  • @template.<helper>( Rotaie 2 )
  • include helper in una classe singleton e poi singleton.helper
  • include l'helper nel controller (ATTENZIONE: trasformerà tutti i metodi helper in azioni del controller)

56
Questa risposta è ancora migliore! In Rails 3, semplicemente chiamare view_context.helper_functionè semplice e funziona alla grande. ActionController::Base.helpers.helper_functionè ugualmente buono.
trisweb,

29
view_context= genio
n_i_c_k

5
ATTENZIONE: non usare view_context.
Istituirà

7
ActionController::Base.helpers.helper_functionnon sembra funzionare. Ottengo NoMethodError - undefined method spell_date_and_time' for #<ActionView::Base:0x007fede56102d0>:quando provo a chiamare ActionController::Base.helpers.spell_date_and_time()un metodo controller. la chiamata view_context.spell_date_and_time()funziona comunque.
Pesce gatto

37
rails 5: utilizza semplicemente helpers.helper_functionnel tuo controller ( github.com/rails/rails/pull/24866 )
Markus

80

In Rails 5 usa il helpers.helper_function tuo controller.

Esempio:

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

Fonte: da un commento di @Markus su una risposta diversa. Ho sentito che la sua risposta meritava la sua risposta poiché era la soluzione più semplice e pulita.

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


6
Sembra un po 'strano che in console tu chiami helperin singolare e in controller sia plurale.
Fellow Stranger,

10

Il mio problema è stato risolto con l'Opzione 1. Probabilmente il modo più semplice è quello di includere il modulo helper nel controller:

class ApplicationController < ActionController::Base
  include ApplicationHelper

...

1
L'unico inconveniente è che aggiunge azioni del controller con il nome delle funzioni di supporto. Ma anche io lo faccio :)
Felix,

9

In generale, se l'helper deve essere usato in (solo) controller, preferisco dichiararlo come metodo di istanza di class ApplicationController.


5
Come metodo protetto
Benjamin Crouzier,

3

In Rails 5+ puoi semplicemente usare la funzione come mostrato di seguito con un semplice esempio:

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

PRODUZIONE

"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

In Rails 5+ è sufficiente utilizzare aiutanti ( helpers.number_to_currency (10000) )

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.