ruby-on-rails-3 - render_to_string - render rails
Los rieles 3 representan la acción de otro controlador (4)
Necesito renderizar otra acción de controlador <%= render "controller/index" %>
y obtengo este error
Falta un controlador / índice parcial con {: formats => [: html],: locale => [: en,: en],: handlers => [: rjs,: rhtml,: rxml,: erb,: builder]} en ver rutas "/ ruta_a / aplicación / vistas"
¿Cómo puedo renderizar otra acción de 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.
Desde la page Rails Guides:
Usar render con: acción es una fuente frecuente de confusión para los recién llegados de Rails. La acción especificada se usa para determinar qué vista mostrar, pero Rails no ejecuta ninguno de los códigos para esa acción en el controlador. Cualquier variable de instancia que requiera en la vista debe configurarse en la acción actual antes de llamar a renderizar.
En resumen, no puede representar otra acción, solo puede representar otra plantilla. Puede obtener el código compartido y moverlo a un método en el controlador de la aplicación. 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
Esto funciona bien para mi :
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
luego, llamar por
render :text => renderActionInOtherController(OtherController,:otherAction,params)
básicamente piratea la otra clase y sobrescribe su método "params" y regresa
Si está utilizando Rails 4:
def renderActionInOtherController(controller,action,params)
c = controller.new
c.params = params
c.dispatch(action, request)
c.response.body
end
Intenta renderizar la plantilla:
<%= render :template => "controller/index" %>
O archivo:
<%= render :template => "#{Rails.root}/app/controllers/controller/index" %>
Y creo que debes renderizarlo a través del controlador, en la medida en que sea más conveniente:
def your_action
...
render :action => :index
end
Si no desea simplemente renderizar la view
del otro controlador (/ modelo), sino que llama a la action
(método), piense más en la forma de vida de ruby: coloque este (s) método (es) en un module
e inclúyalo en los controladores. lo necesita.
Creo que es menos ''espeluznante'' que tocar de algún modo 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