with render_to_string rails from ruby-on-rails view render

ruby-on-rails - render_to_string - render json rails



Rieles: renderizar una vista(no una parcial) desde dentro de una vista (4)

Tengo un controlador que responde tanto a html como a js . La vista html representa toda la página (incluido el encabezado y el pie de página), mientras que js solo reemplaza #main . Además del encabezado y el pie de página, ambos formatos generan el mismo contenido. Puedo obtener este efecto con tres archivos:

_show.html.erb <div>Content!</div> show.html.erb <%= render "show" %> show.js.erb $("#main").fadeIn("<%= escape_javascript(render ''show'') %>");

Esto funciona, pero preferiría que no necesitara un _show parcial por separado. Lamentablemente, esto no funciona:

show.html.erb <div>Content!</div> show.js.erb $("#main").fadeIn("<%= escape_javascript(render ''show'') %>");

Como Rails buscará el show parcial, no la vista real.

¿Hay alguna manera de hacer que Rails busque el archivo de vista, en lugar de hacerlo de forma parcial?


Al igual que otros han mencionado, la representación de otra vista no parcial en otra vista es "No es el camino del raíl", si aún así insistes en hacerlo, un método es:

<%= render :file => ''<replace with relative/absolute path>'' %>


Esta no es una buena práctica como puede ver en los comentarios. Los rieles tienen los conceptos de vista , parcial y diseño . Dicho eso, la vista es la única que debes seguir usando solo una vez. Entonces mis sugerencias son:

  1. Si considera que se podría representar más de una vista adicional dentro de su vista actual, lo más probable es que esté buscando un diseño
  2. Si considera que uno de sus puntos de vista debería aparecer en muchas páginas, está buscando un parcial
  3. Si esta vista debe mostrar solo una vista adicional dentro de ella, y esa vista solo debe representarse dentro de la vista actual, puede elegir cualquiera de las opciones anteriores o ninguna , eso es todo, vaya con un solo archivo

Representar una vista no parcial dentro de otra vista no es exactamente el Rails Way ™. Su solución actual es probablemente mejor, y no es un enfoque poco común. Cámbiele el nombre _cuerpo, o algo más apropiado, si se siente raro con el nombre parcial que es el mismo que la acción.

Sin embargo, si su vista se puede compartir, como parece que podría ser en este caso, podría simplemente hacer un diseño.

Esto se ve facilitado por el hecho de que, en contra del principio de menor sorpresa, Rails renderizará una plantilla html para una acción js si no existe una plantilla js . Esto significa que puede eliminar tanto la plantilla js, como la parcial, y simplemente crear un diseño titulado, por ejemplo, fadein.js.erb :

# yourviews/show.html.erb <div>Content!</div> # layouts/fadein.js.erb $("#main").fadeIn("<%= escape_javascript(yield) %>"); # YourController.rb def show # ... respond_to do |wants| wants.html wants.js { render :layout => "fadein" } end end


solo necesitas pasar un contexto a tu método de render :

<%= render :template => "show" -%>