Rails 3 render acción desde otro controlador
Necesito renderizar otra acción del controlador <%= render "controller/index" %>
y me sale este error
Falta un controlador/índice parcial con {:formats=>[:html], :locale=>[:en, :en], :handlers=>[:rjs, :rhtml, :rxml, :erb, :builder]} en ver rutas "/path_to/app/views"
¿Cómo puedo renderizar otra acción del controlador en una vista pero sin enviar una redirección al cliente ? He intentado
<%=render :action => "index", :controller=>"controller" %>
Pero parece que no está funcionando.
4 answers
Intenta renderizar la plantilla:
<%= render :template => "controller/index" %>
O archivo:
<%= render :template => "#{Rails.root}/app/controllers/controller/index" %>
Y creo que deberías renderizarlo a través del controlador, en la medida en que sea más conveniente:
def your_action
...
render :action => :index
end
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-12 14:21:01
Esto funciona bien para mí :
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
Entonces, llame por
render :text => renderActionInOtherController(OtherController,:otherAction,params)
Básicamente hackea la otra clase y sobrescribe su método "params" y devuelve
Si está utilizando Rails 4:
def renderActionInOtherController(controller,action,params)
c = controller.new
c.params = params
c.dispatch(action, request)
c.response.body
end
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-18 19:52:15
De Rails Guides page :
Usando render con: la acción es una fuente frecuente de confusión para los rieles llegado. La acción especificada es se utiliza para determinar qué vista render, pero Rails no ejecuta ninguno de el código para esa acción en el controlador. Cualquier variable de instancia que usted requiere en la vista debe ser configurar en la acción actual antes llamando a render.
Así que, en resumen, no puedes renderizar otra acción, solo puedes renderizar otra plantilla. Puede obtener el código compartido y moverlo a un método en application controller. También podría intentar algo en esta línea si realmente no puede estructurar su código de alguna otra manera:
# 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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-18 23:16:53
Si no solo desea renderizar el view
del otro controlador (/model), sino llamar al action
(método), piense más en la forma de vida de ruby: ponga este método(s) en un module
e inclúyalo en los controladores que necesita.
Creo que es menos 'espeluznante' que tocar de alguna manera a otro controlador.
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-05 14:12:41