Rails 3 rende l’azione da un altro controller

Ho bisogno di rendere un’altra azione del controller e ottengo questo errore

Controller / indice parziale mancante con {: formats => [: html],: locale => [: en,: en],: handlers => [: rjs,: rhtml,: rxml,: erb,: builder]} in visualizza percorsi “/ path_to / app / views”

come posso eseguire il rendering di un’altra azione del controller in una vista ma senza inviare un reindirizzamento al client? ho provato

  "index", :controller=>"controller" %> 

ma sembra che non funzioni.

Prova a renderizzare il modello:

 <%= render :template => "controller/index" %> 

O file:

 <%= render :template => "#{Rails.root}/app/controllers/controller/index" %> 

E credo che dovresti renderlo attraverso il controller, per quanto è più conveniente:

 def your_action ... render :action => :index end 

Questo funziona bene per me:

 def renderActionInOtherController(controller,action,params) controller.class_eval{ def params=(params); @params = params end def params; @params end } c = controller.new c.request = @_request c.response = @_response c.params = params c.send(action) c.response.body end 

quindi, chiama

 render :text => renderActionInOtherController(OtherController,:otherAction,params) 

fondamentalmente ha hackerato l’altra class e sovrascrive il suo metodo “params” e lo restituisce

Se stai utilizzando Rails 4:

 def renderActionInOtherController(controller,action,params) c = controller.new c.params = params c.dispatch(action, request) c.response.body end 

Dalla pagina Guide Rails:

Usare render con: l’azione è una fonte frequente di confusione per i nuovi arrivati ​​di Rails. L’azione specificata viene utilizzata per determinare quale vista eseguire il rendering, ma Rails non esegue alcun codice per quella azione nel controller. Qualsiasi variabile di istanza richiesta nella vista deve essere impostata nell’azione corrente prima di chiamare il rendering.

Quindi, in breve, non è ansible eseguire il rendering di un’altra azione, è ansible solo visualizzare un altro modello. È ansible ottenere il codice condiviso e spostarlo su un metodo nel controller dell’applicazione. Puoi anche provare qualcosa seguendo questa linea se davvero non puoi strutturare il tuo codice in qualche altro modo:

 # This is a hack, I'm not even sure that it will work and it will probably # mess up your filters (like ignore them). other_controller = OtherController.new other_controller.request = @_request other_controller.some_action 

Se non vuoi solo visualizzare la view dell’altro controller (/ modello), ma chiama l’ action (metodo), pensa di più al modo di vivere ruby – metti questo / i metodo / i in un module e includilo nei controller ne hai bisogno.

Penso che sia meno “spettrale”, quindi in qualche modo tocca un altro controller.

 module StandardActions def show_user_homepage(local_params=params) #something finding #something to check render :"homepage/show" def end class AddressesController < ApplicationController include StandardActions def update # update address if ok show_user_homepage(id: user_id) else #errorthings render :edit #(eg.) end end end class HobbiesController < ApplicationController include StandardActions def update # update hobby if ok show_user_homepage(id: user_id) else #errorthings render :edit #(eg.) end end end