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.

Author: Camilo Martinez, 2011-05-19

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
 29
Author: fl00r,
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
 21
Author: gene tsai,
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
 19
Author: Marek Sapota,
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
 0
Author: halfbit,
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