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:
- 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
- Si considera que uno de sus puntos de vista debería aparecer en muchas páginas, está buscando un parcial
- 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" -%>