2016-06-15 19 views
6

Sto usando il metodo Rails 5 ApplicationController.renderer.render per eseguire il rendering all'interno di un modello. Ho bisogno di passare alcune variabili al mio layout che ho fatto usando l'opzione locals; questa variabile è quindi disponibile nel layout se si accede direttamente, ma non tramite self.Rails 5 rendering dall'esterno di un controller con ApplicationController.renderer.render non imposta variabili su self

Ecco come ho impostato il mio rendere

html_string = ApplicationController.renderer.render(
    file: "/#{template_path}/base/show", 
    :formats => [:pdf,:html], 
    locals: { 
    :@routing_form => self, 
    :controller_name => controller_name, 
    :action_name => action_name, 
    :current_user => current_user 
    }, 
    :layout => '/layouts/application' 
) 

Poi all'interno del layout che voglio fare qualcosa di simile.

<div id="foo" class="<%= self.action_name %>"> 

sono stato in grado di ottenere questo lavoro facendo cadere self in questo caso particolare

<div id="foo" class="<%= action_name %>"> 

ma ora la mia preoccupazione è come vorrei impostare una variabile in modo che avrebbe funzionato correttamente con self? Precedentemente stavo usando la gemma render_anywhere e questa è stata gestita usando rendering_controller.var = "value"

+1

Che classe non 'self' appartiene? Suppongo che l'oggetto 'self' non abbia i metodi' controller_name', 'action_name' e' current_user' (si tratti di un controller?), Quindi si innesca per te (hai detto che stai eseguendo il rendering da "all'interno di un modello") – sequielo

+1

Hai provato a 'assigns' invece di' locals'? – AlexN

+1

@AlexN, sì; che non ha alcun impatto su questo particolare problema. – bigtunacan

risposta

3

Poiché self è una parola chiave in Ruby, non è possibile utilizzarla come una chiamata di metodo nel modello di layout, quindi è necessario utilizzare un altro nome per passare con la gente del posto.

È possibile passare qualcosa come my_object: self e funzionerà correttamente.

Se si desidera denominare la chiave con una @, si dovrebbe mettere all'interno di una stringa '@my_object': self e chiede normalmente nel modello: <%= @my_object.action_name%>

+2

Penso che tu abbia frainteso la mia domanda. Nel mio esempio puoi vedere che ho passato ': @routing_form => self' come mi aspetto che @routing_form venga assegnato a se stesso prima che venga passato poiché è l'oggetto corrente con cui lavoro. Gli altri locali che passo come ': controller_name => controller_name' Mi piacerebbe essere in grado di chiamare come' self.controller_name' all'interno del layout. Nel percorso standard di rendering di una vista, ciò funzionerebbe; con la gemma render_anywhere (ora obsoleta), questo ha continuato a funzionare. Ora in Rails 5 non è così. – bigtunacan

+2

Penso che ci sia un po 'di confusione su cosa sia la parola chiave self. Questo non è inteso come un nome di variabile a cui è possibile assegnare qualcosa. 'self' farà riferimento all'istanza corrente di un oggetto inizializzato. Nel caso del renderer, non credo che ci sia un evento di istanziazione, e quindi non c'è nessun 'sé' disponibile. –

+2

Nel caso di un tipico ciclo di richiesta del rendering, le variabili di istanza dal controller vengono restituite alla vista durante l'inizializzazione. Queste variabili sono quindi disponibili su 'self', che sarebbe un oggetto vista. Render Anywhere simula lo stesso comportamento durante il rendering di una vista al di fuori del tipico ciclo di richieste (in questo caso da un modello). – bigtunacan

Problemi correlati