2011-06-02 10 views
13

En mi aplicación Rails 3 utilizo Ajax para conseguir un formato HTML:¿Es posible llamar al método que usa "content_tag" del controlador en Rails 3?

$.get("/my/load_page?page=5", function(data) { 
    alert(data); 
}); 

class MyController < ApplicationController 
    def load_page 
    render :js => get_page(params[:page].to_i) 
    end 
end 

get_page utiliza el método content_tag y debería estar disponible también en app/views/my/index.html.erb.

Desde get_page utiliza muchos otros métodos, que encapsula toda la funcionalidad en:

# lib/page_renderer.rb 
module PageRenderer 
    ... 
    def get_page 
    ... 
    end 
    ... 
end 

y la incluyó como esa:

# config/environment.rb 
require 'page_renderer' 

# app/controllers/my_controller.rb 
class MyController < ApplicationController 
    include PageRenderer 
    helper_method :get_page 
end 

Pero, puesto que el método content_tag no está disponible en app/controllers/my_controller.rb , Obtuve el siguiente error:

undefined method `content_tag' for #<LoungeController:0x21486f0> 

tanto, he intentado añadir:

module PageRenderer 
    include ActionView::Helpers::TagHelper  
    ... 
end 

pero luego llegué:

undefined method `output_buffer=' for #<LoungeController:0x21bded0> 

¿Qué estoy haciendo mal?

¿Cómo solucionaría esto?

+0

lo que si se incluyen: 'ActionView :: :: Ayudantes TagHelper 'en tu controlador. Por cierto, parece que usas mi respuesta de las preguntas de tus ayudantes :) – apneadiving

+0

@apneadiving: Incluí 'ActionView :: Helpers :: TagHelper' como puedes ver arriba. Sí, su respuesta a mi otra pregunta parece razonable, excepto el hecho de que 'get_page' trata de la representación, pero se define en el controlador :) –

+0

Maldita sea, mi comentario fue realmente inútil, lo siento, volveré a mirar más tarde :) – apneadiving

Respuesta

2

Los ayudantes son realmente código de vista y no deben usarse en controladores, lo que explica por qué es tan difícil hacerlo realidad.

Otra (en mi humilde opinión, mejor) forma de hacerlo sería crear una vista o parcial con el HTML que desee envolver alrededor de los parámetros [: page] .to_i. Luego, en su controlador, puede usar render_to_string para poblar: js en el renderizado principal al final del método load_page. Entonces puedes deshacerte de todas esas otras cosas y será bastante más limpio.

Dicho sea de paso, helper_method hace lo contrario de lo que estás tratando de hacer: pone a disposición un método de control en las vistas.

+0

¡Gracias! Intenté tu sugerencia y funciona como un encanto :) –

28

Para responder a la pregunta propuesta, ActionView :: Contexto define el método output_buffer, para resolver el error basta con incluir el módulo correspondiente:

module PageRenderer 
include ActionView::Helpers::TagHelper 
include ActionView::Context  
... 
end 
+0

'método indefinido' content_tag 'para ActionView :: Helpers :: TagHelper: Module' –

+0

¡también funciona en 'seeds.rb'! – anthony

Cuestiones relacionadas