-
Notifications
You must be signed in to change notification settings - Fork 0
/
layouts_and _rendering.html
1929 lines (1868 loc) · 132 KB
/
layouts_and _rendering.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Diseños y Renderizado en Rails — Ruby on Rails Guides</title>
<link rel="stylesheet" type="text/css" href="stylesheets/style.css" data-turbolinks-track="reload">
<link rel="stylesheet" type="text/css" href="stylesheets/print.css" media="print">
<link rel="stylesheet" type="text/css" href="stylesheets/prism/default.css" data-turbolinks-track="reload">
<link rel="stylesheet" type="text/css" href="stylesheets/prism/rails-guides.css" data-turbolinks-track="reload">
<link href="images/favicon.ico" rel="shortcut icon" type="image/x-icon" />
<script src="javascripts/prism.js" data-turbolinks-track="reload"></script>
<script src="javascripts/turbolinks.js" data-turbolinks-track="reload"></script>
<script src="javascripts/guides.js" data-turbolinks-track="reload"></script>
<script src="javascripts/responsive-tables.js" data-turbolinks-track="reload"></script>
<meta property="og:title" content="Diseños y Renderizado en Rails — Ruby on Rails Guides" />
<meta name="description" content="NO LEA ESTE ARCHIVO EN GITHUB, LAS GUÍAS SE PUBLICAN EN https://guides.rubyonrails.org.Diseños y Renderizado en RailsEsta guía cubre las características de diseño básicas de Action Controller y Action View.Después de leer esta guía, sabrá: Cómo usar los diversos métodos de renderizado integrados en Rails. Cómo crear diseños con múltiples secciones de contenido. Cómo usar parciales para SECAR tus vistas. Cómo utilizar diseños anidados (sub-plantillas)." />
<meta property="og:description" content="NO LEA ESTE ARCHIVO EN GITHUB, LAS GUÍAS SE PUBLICAN EN https://guides.rubyonrails.org.Diseños y Renderizado en RailsEsta guía cubre las características de diseño básicas de Action Controller y Action View.Después de leer esta guía, sabrá: Cómo usar los diversos métodos de renderizado integrados en Rails. Cómo crear diseños con múltiples secciones de contenido. Cómo usar parciales para SECAR tus vistas. Cómo utilizar diseños anidados (sub-plantillas)." />
<meta property="og:locale" content="en_US" />
<meta property="og:site_name" content="Ruby on Rails Guides" />
<meta property="og:image" content="https://avatars.githubusercontent.com/u/4223" />
<meta property="og:type" content="website" />
</head>
<body class="guide">
<div>
<!-- <img src="images/edge_badge.png" alt="edge-badge" id="edge-badge" />-->
</div>
<div id="topNav">
<div class="wrapper">
<strong class="more-info-label">Más en <a href="https://rubyonrails.org/">rubyonrails.org:</a> </strong>
<span class="red-button more-info-button">
Más Ruby on Rails
</span>
<ul class="more-info-links s-hidden">
<li class="more-info"><a href="https://weblog.rubyonrails.org/">Blog</a></li>
<li class="more-info"><a href="https://guides.rubyonrails.org/">Guías</a></li>
<li class="more-info"><a href="https://api.rubyonrails.org/">API</a></li>
<li class="more-info"><a href="https://stackoverflow.com/questions/tagged/ruby-on-rails">Pedir Ayuda</a></li>
<li class="more-info"><a href="https://github.com/rails/rails">Contribuir on GitHub</a></li>
</ul>
</div>
</div>
<div id="header">
<div class="wrapper clearfix">
<h1><a href="index.html" title="Guías de Ruby on Rails">Guías de Ruby on Rails </a></h1>
<ul class="nav">
<li><a class="nav-item" href="index.html">Inicio</a></li>
<li class="guides-index guides-index-large">
<a href="index.html" id="guidesMenu" class="guides-index-item nav-item">Index de Guías </a>
<div id="guides" class="clearfix" style="display: none;">
<hr />
<dl class="guides-section-container">
<div class="guides-section">
<dt>Empieza Aqui</dt>
<dd><a href="getting_started.html">Introducción a Rails</a></dd>
</div>
<div class="guides-section">
<dt>Modelos</dt>
<dd><a href="active_record_basics.html">Conceptos básicos de Active Record</a></dd>
<dd><a href="active_record_migrations.html">Migraciones de Active Record</a></dd>
<dd><a href="active_record_validations.html">Validaciones de Active Record</a></dd>
<dd><a href="active_record_callbacks.html">Devolución (callbacks) de Llamadas de Active Record</a></dd>
<dd><a href="association_basics.html">Asociaciones de Active Record</a></dd>
<dd><a href="active_record_querying.html">Interfaz de Consulta de Active Record</a></dd>
</div>
<div class="guides-section">
<dt>Vistas</dt>
<dd><a href="layouts_and_rendering.html">Diseños y Renderizado en Rails</a></dd>
<dd><a href="form_helpers.html">Ayudantes de Formulario de Action</a></dd>
</div>
<div class="guides-section">
<dt>Controladores</dt>
<dd><a href="action_controller_overview.html">Descripción General de Action Controller</a></dd>
<dd><a href="routing.html">Rails Routing Desde el Exterior Hacia Adentro</a></dd>
</div>
<div class="guides-section">
<dt>Otros Componentes</dt>
<dd><a href="active_support_core_extensions.html">Extensiones de Núcleo de Active Support</a></dd>
<dd><a href="action_mailer_basics.html">Conceptos Básicos de Action Mailer</a></dd>
<dd><a href="active_job_basics.html">Conceptos Básicos de Active Job</a></dd>
<dd><a href="active_storage_overview.html">Descripción General de Active Storage</a></dd>
<dd><a href="action_cable_overview.html">Descripción General de Action Cable</a></dd>
</div>
<div class="guides-section">
<dt>Temas Avanzados</dt>
<dd><a href="i18n.html">Rails API de Internacionalización (I18n)</a></dd>
<dd><a href="testing.html">Prueba de Aplicaciones de Rails</a></dd>
<dd><a href="security.html">Seguridad de Aplicaciones Rails</a></dd>
<dd><a href="debugging_rails_applications.html">Depuración de Applications Rails</a></dd>
<dd><a href="configuring.html">Configuración de Aplicaciones de Rails</a></dd>
<dd><a href="command_line.html">La Línea de Comandos de Rails</a></dd>
<dd><a href="asset_pipeline.html">La Canalización de Activos</a></dd>
<dd><a href="autoloading_and_reloading_constants.html">Constantes de Autocarga y Recarga (Zeitwerk Mode)</a></dd>
<dd><a href="autoloading_and_reloading_constants_classic_mode.html">Constantes de Autocarga y Recarga (modo clásico)</a></dd>
<dd><a href="caching_with_rails.html">Almacenamiento en Caché con Rails Descripción General</a></dd>
<dd><a href="api_app.html">Uso de Rails para Aplicaciones Solo API</a></dd>
</div>
<div class="guides-section">
<dt>Extending Rails (toda la sección necesita traducción)</dt>
<dd><a href="rails_on_rack.html">Rails on Rack</a></dd>
<dd><a href="generators.html">Creating and Customizing Rails Generators & Templates</a></dd>
</div>
</dl>
</div>
</li>
<li><a class="nav-item" href="contributing_to_ruby_on_rails.html">Contribuir</a></li>
<li class="guides-index guides-index-small">
<select class="guides-index-item nav-item">
<option value="index.html">Guides Index</option>
<optgroup label="Empieza Aqui">
<option value="getting_started.html">Introducción a Rails</option>
</optgroup>
<optgroup label="Modelos">
<option value="active_record_basics.html">Conceptos básicos de Active Record</option>
<option value="active_record_migrations.html">Migraciones de Active Record</option>
<option value="active_record_validations.html">Validaciones de Active Record</option>
<option value="active_record_callbacks.html">Devolución (callbacks) de Llamadas de Active Record</option>
<option value="association_basics.html">Asociaciones de Active Record</option>
<option value="active_record_querying.html">Interfaz de Consulta de Active Record</option>
</optgroup>
<optgroup label="Vistas">
<option value="layouts_and_rendering.html">Diseños y Renderizado en Rails</option>
<option value="form_helpers.html">Ayudantes de Formulario de Action</option>
</optgroup>
<optgroup label="Controladores">
<option value="action_controller_overview.html">Descripción General de Action Controller</option>
<option value="routing.html">Rails Routing Desde el Exterior Hacia Adentro</option>
</optgroup>
<optgroup label="Otros Componentes">
<option value="active_support_core_extensions.html">Extensiones de Núcleo de Active Support</option>
<option value="action_mailer_basics.html">Conceptos Básicos de Action Mailer</option>
<option value="active_job_basics.html">Conceptos Básicos de Active Job</option>
<option value="active_storage_overview.html">Descripción General de Active Storage</option>
<option value="action_cable_overview.html">Descripción General de Action Cable</option>
</optgroup>
<optgroup label="Temas Avanzados">
<option value="i18n.html">Rails API de Internacionalización (I18n)</option>
<option value="testing.html">Prueba de Aplicaciones de Rails</option>
<option value="security.html">Seguridad de Aplicaciones Rails</option>
<option value="debugging_rails_applications.html">Depuración de Applications Rails</option>
<option value="configuring.html">Configuración de Aplicaciones de Rails</option>
<option value="command_line.html">La Línea de Comandos de Rails</option>
<option value="asset_pipeline.html">La Canalización de Activos</option>
<option value="autoloading_and_reloading_constants.html">Constantes de Autocarga y Recarga (Zeitwerk Mode)</option>
<option value="autoloading_and_reloading_constants_classic_mode.html">Constantes de Autocarga y Recarga (modo clásico)</option>
<option value="caching_with_rails.html">Almacenamiento en Caché con Rails Descripción General</option>
<option value="api_app.html">Uso de Rails para Aplicaciones Solo API</option>
</optgroup>
<optgroup label="Extending Rails (toda la sección necesita traducción)">
<option value="rails_on_rack.html">Rails on Rack</option>
<option value="generators.html">Creating and Customizing Rails Generators & Templates</option>
</optgroup>
</select>
</li>
</ul>
</div>
</div>
<hr class="hide" />
<div id="feature">
<div class="wrapper">
<p><strong>NO LEA ESTE ARCHIVO EN GITHUB, LAS GUÍAS SE PUBLICAN EN <a href="https://guides.rubyonrails.org">https://guides.rubyonrails.org</a>.</strong></p><h2>Diseños y Renderizado en Rails</h2><p>Esta guía cubre las características de diseño básicas de Action Controller y Action View.</p><p>Después de leer esta guía, sabrá:</p>
<ul>
<li>Cómo usar los diversos métodos de renderizado integrados en Rails.</li>
<li>Cómo crear diseños con múltiples secciones de contenido.</li>
<li>Cómo usar parciales para SECAR tus vistas.</li>
<li>Cómo utilizar diseños anidados (sub-plantillas).</li>
</ul>
<div id="subCol">
<h3 class="chapter"><img src="images/chapters_icon.gif" alt="" />Chapters</h3>
<ol class="chapters">
<li><a href="#overview-how-the-pieces-fit-together">Overview: How the Pieces Fit Together</a></li>
<li>
<a href="#creating-responses">Creating Responses</a>
<ul>
<li><a href="#rendering-by-default-convention-over-configuration-in-action">Rendering by Default: Convention Over Configuration in Action</a></li>
<li><a href="#using-render">Using <code>render</code></a></li>
<li><a href="#using-redirect-to">Using <code>redirect_to</code></a></li>
<li><a href="#using-head-to-build-header-only-responses">Using <code>head</code> To Build Header-Only Responses</a></li>
</ul>
</li>
<li>
<a href="#structuring-layouts">Structuring Layouts</a>
<ul>
<li><a href="#asset-tag-helpers">Asset Tag Helpers</a></li>
<li><a href="#understanding-yield">Understanding <code>yield</code></a></li>
<li><a href="#using-the-content-for-method">Using the <code>content_for</code> Method</a></li>
<li><a href="#using-partials">Using Partials</a></li>
<li><a href="#using-nested-layouts">Using Nested Layouts</a></li>
</ul>
</li>
</ol>
</div>
</div>
</div>
<div id="container">
<div class="wrapper">
<div id="mainCol">
<h3 id="overview-how-the-pieces-fit-together"><a class="anchorlink" href="#overview-how-the-pieces-fit-together">1 Overview: How the Pieces Fit Together</a></h3><p>Esta guía se centra en la interacción entre el Controlador y la Vista en el triángulo Modelo-Vista-Controlador. Como sabe, el controlador es responsable de organizar todo el proceso de manejo de una solicitud en Rails, aunque normalmente entrega cualquier código pesado al modelo. Pero luego, cuando llega el momento de enviar una respuesta al usuario, el Controlador entrega las cosas a la Vista. Es ese traspaso el tema de esta guía.</p><p>A grandes rasgos, esto implica decidir qué se debe enviar como respuesta y llamar a un método apropiado para crear esa respuesta. Si la respuesta es una vista completa, Rails también hace un trabajo adicional para envolver la vista en un diseño y posiblemente extraer vistas parciales. Verá todos esos caminos más adelante en esta guía.</p><h3 id="creating-responses"><a class="anchorlink" href="#creating-responses">2 Creating Responses</a></h3><p>Desde el punto de vista del controlador, hay tres formas de crear una respuesta HTTP:</p>
<ul>
<li>Llame a <code>render</code> para crear una respuesta completa para enviar de vuelta al navegador</li>
<li>Llame a <code>redirect_to</code> para enviar un código de estado de redirección HTTP al navegador</li>
<li>Llame a <code>head</code> para crear una respuesta que consta únicamente de encabezados HTTP para enviar de vuelta al navegador</li>
</ul>
<h4 id="rendering-by-default-convention-over-configuration-in-action"><a class="anchorlink" href="#rendering-by-default-convention-over-configuration-in-action">2.1 Rendering by Default: Convention Over Configuration in Action</a></h4><p>Has escuchado que Rails promueve la "convención sobre la configuración". La representación predeterminada es un excelente ejemplo de esto. De forma predeterminada, los controladores en Rails representan automáticamente vistas con nombres que corresponden a rutas válidas. Por ejemplo, si tiene este código en su clase <code>BooksController</code>:</p><div class="code_container">
<pre><code class="highlight ruby"><span class="k">class</span> <span class="nc">BooksController</span> <span class="o"><</span> <span class="no">ApplicationController</span>
<span class="k">end</span>
</code></pre>
<button class="clipboard-button" data-clipboard-text="class BooksController < ApplicationController
end
">Copy</button>
</div>
<p>Y lo siguiente en su archivo de rutas:</p><div class="code_container">
<pre><code class="highlight ruby"><span class="n">resources</span> <span class="ss">:books</span>
</code></pre>
<button class="clipboard-button" data-clipboard-text="resources :books
">Copy</button>
</div>
<p>Y tienes un archivo de vista<code>app/views/books/index.html.erb</code>:</p><div class="code_container">
<pre><code class="highlight erb"><span class="nt"><h1></span>Books are coming soon!<span class="nt"></h1></span>
</code></pre>
<button class="clipboard-button" data-clipboard-text="<h1>Books are coming soon!</h1>
">Copy</button>
</div>
<p>Rails mostrará automáticamente <code>app/views/books/index.html.erb</code> cuando navegue a<code>/books</code> y verá "¡Pronto vendrán libros!" en tu pantalla</p><p>Sin embargo, una próxima pantalla es mínimamente útil, por lo que pronto creará su modelo <code>Book</code> y agregará la acción de índice a <code>BooksController</code>:</p><div class="code_container">
<pre><code class="highlight ruby"><span class="k">class</span> <span class="nc">BooksController</span> <span class="o"><</span> <span class="no">ApplicationController</span>
<span class="k">def</span> <span class="nf">index</span>
<span class="vi">@books</span> <span class="o">=</span> <span class="no">Book</span><span class="p">.</span><span class="nf">all</span>
<span class="k">end</span>
<span class="k">end</span>
</code></pre>
<button class="clipboard-button" data-clipboard-text="class BooksController < ApplicationController
def index
@books = Book.all
end
end
">Copy</button>
</div>
<p>Tenga en cuenta que no tenemos una representación explícita al final de la acción de índice de acuerdo con el principio de "convención sobre configuración". La regla es que si no renderizas algo explícitamente al final de una acción del controlador, Rails buscará automáticamente la plantilla <code>action_name.html.erb</code> en la ruta de la vista del controlador y la renderizará. Entonces, en este caso, Rails representará el archivo <code>app / views / books / index.html.erb</code>.</p><p>Si queremos mostrar las propiedades de todos los libros en nuestra vista, podemos hacerlo con una plantilla ERB como esta:</p><div class="code_container">
<pre><code class="highlight erb"><span class="nt"><h1></span>Listing Books<span class="nt"></h1></span>
<span class="nt"><table></span>
<span class="nt"><thead></span>
<span class="nt"><tr></span>
<span class="nt"><th></span>Title<span class="nt"></th></span>
<span class="nt"><th></span>Content<span class="nt"></th></span>
<span class="nt"><th</span> <span class="na">colspan=</span><span class="s">"3"</span><span class="nt">></th></span>
<span class="nt"></tr></span>
<span class="nt"></thead></span>
<span class="nt"><tbody></span>
<span class="cp"><%</span> <span class="vi">@books</span><span class="p">.</span><span class="nf">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">book</span><span class="o">|</span> <span class="cp">%></span>
<span class="nt"><tr></span>
<span class="nt"><td></span><span class="cp"><%=</span> <span class="n">book</span><span class="p">.</span><span class="nf">title</span> <span class="cp">%></span><span class="nt"></td></span>
<span class="nt"><td></span><span class="cp"><%=</span> <span class="n">book</span><span class="p">.</span><span class="nf">content</span> <span class="cp">%></span><span class="nt"></td></span>
<span class="nt"><td></span><span class="cp"><%=</span> <span class="n">link_to</span> <span class="s2">"Show"</span><span class="p">,</span> <span class="n">book</span> <span class="cp">%></span><span class="nt"></td></span>
<span class="nt"><td></span><span class="cp"><%=</span> <span class="n">link_to</span> <span class="s2">"Edit"</span><span class="p">,</span> <span class="n">edit_book_path</span><span class="p">(</span><span class="n">book</span><span class="p">)</span> <span class="cp">%></span><span class="nt"></td></span>
<span class="nt"><td></span><span class="cp"><%=</span> <span class="n">link_to</span> <span class="s2">"Destroy"</span><span class="p">,</span> <span class="n">book</span><span class="p">,</span> <span class="ss">method: :delete</span><span class="p">,</span> <span class="ss">data: </span><span class="p">{</span> <span class="ss">confirm: </span><span class="s2">"Are you sure?"</span> <span class="p">}</span> <span class="cp">%></span><span class="nt"></td></span>
<span class="nt"></tr></span>
<span class="cp"><%</span> <span class="k">end</span> <span class="cp">%></span>
<span class="nt"></tbody></span>
<span class="nt"></table></span>
<span class="nt"><br></span>
<span class="cp"><%=</span> <span class="n">link_to</span> <span class="s2">"New book"</span><span class="p">,</span> <span class="n">new_book_path</span> <span class="cp">%></span>
</code></pre>
<button class="clipboard-button" data-clipboard-text='<h1>Listing Books</h1>
<table>
<thead>
<tr>
<th>Title</th>
<th>Content</th>
<th colspan="3"></th>
</tr>
</thead>
<tbody>
<% @books.each do |book| %>
<tr>
<td><%= book.title %></td>
<td><%= book.content %></td>
<td><%= link_to "Show", book %></td>
<td><%= link_to "Edit", edit_book_path(book) %></td>
<td><%= link_to "Destroy", book, method: :delete, data: { confirm: "Are you sure?" } %></td>
</tr>
<% end %>
</tbody>
</table>
<br>
<%= link_to "New book", new_book_path %>
'>Copy</button>
</div>
<div class="note"><p>La representación real se realiza mediante clases anidadas del módulo. <a href="https://edgeapi.rubyonrails.org/classes/ActionView/Template/Handlers.html"><code>ActionView::Template::Handlers</code></a>. Esta guía no profundiza en ese proceso, pero es importante saber que la extensión del archivo en su vista controla la elección del manejador de plantillas.</p></div><h4 id="using-render"><a class="anchorlink" href="#using-render">2.2 Using <code>render</code></a></h4><p>En la mayoría de los casos, el método <code>ActionController::Base#render</code> hace el trabajo pesado de representar el contenido de su aplicación para que lo use un navegador. Hay una variedad de formas de personalizar el comportamiento de <code>render</code>. Puede representar la vista predeterminada para una plantilla de Rails, o una plantilla específica, o un archivo, o código en línea, o nada en absoluto. Puede representar texto, JSON o XML. También puede especificar el tipo de contenido o el estado HTTP de la respuesta renderizada.</p><div class="info"><p>si desea ver los resultados exactos de una llamada a <code>render</code> sin necesidad de inspeccionarla en un navegador, puede llamar a <code>render_to_string</code>. Este método toma exactamente las mismas opciones que <code>render</code>, pero devuelve una cadena en lugar de enviar una respuesta al navegador.</p></div><h5 id="rendering-an-action-s-view"><a class="anchorlink" href="#rendering-an-action-s-view">2.2.1 Rendering an Action's View</a></h5><p>Si desea renderizar la vista que corresponde a una plantilla diferente dentro del mismo controlador, puede usar <code>render</code> con el nombre de la vista:</p><div class="code_container">
<pre><code class="highlight ruby"><span class="k">def</span> <span class="nf">update</span>
<span class="vi">@book</span> <span class="o">=</span> <span class="no">Book</span><span class="p">.</span><span class="nf">find</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="ss">:id</span><span class="p">])</span>
<span class="k">if</span> <span class="vi">@book</span><span class="p">.</span><span class="nf">update</span><span class="p">(</span><span class="n">book_params</span><span class="p">)</span>
<span class="n">redirect_to</span><span class="p">(</span><span class="vi">@book</span><span class="p">)</span>
<span class="k">else</span>
<span class="n">render</span> <span class="s2">"edit"</span>
<span class="k">end</span>
<span class="k">end</span>
</code></pre>
<button class="clipboard-button" data-clipboard-text='def update
@book = Book.find(params[:id])
if @book.update(book_params)
redirect_to(@book)
else
render "edit"
end
end
'>Copy</button>
</div>
<p>Si falla la llamada a <code>update</code>, al llamar a la acción <code>update</code> en este controlador se mostrará la plantilla <code>edit.html.erb</code> que pertenece al mismo controlador.</p><p>Si lo prefiere, puede utilizar un símbolo en lugar de una cadena para especificar la acción a representar:</p><div class="code_container">
<pre><code class="highlight ruby"><span class="k">def</span> <span class="nf">update</span>
<span class="vi">@book</span> <span class="o">=</span> <span class="no">Book</span><span class="p">.</span><span class="nf">find</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="ss">:id</span><span class="p">])</span>
<span class="k">if</span> <span class="vi">@book</span><span class="p">.</span><span class="nf">update</span><span class="p">(</span><span class="n">book_params</span><span class="p">)</span>
<span class="n">redirect_to</span><span class="p">(</span><span class="vi">@book</span><span class="p">)</span>
<span class="k">else</span>
<span class="n">render</span> <span class="ss">:edit</span>
<span class="k">end</span>
<span class="k">end</span>
</code></pre>
<button class="clipboard-button" data-clipboard-text="def update
@book = Book.find(params[:id])
if @book.update(book_params)
redirect_to(@book)
else
render :edit
end
end
">Copy</button>
</div>
<h5 id="rendering-an-action-s-template-from-another-controller"><a class="anchorlink" href="#rendering-an-action-s-template-from-another-controller">2.2.2 Rendering an Action's Template from Another Controller</a></h5><p>¿Qué sucede si desea renderizar una plantilla desde un controlador completamente diferente del que contiene el código de acción? También puede hacerlo con <code>render</code>, que acepta la ruta completa (relativa a<code>app/views</code>) de la plantilla para renderizar. Por ejemplo, si está ejecutando código en un "AdminProductsController" que se encuentra en <code>app / controllers / admin</code>, puede representar los resultados de una acción en una plantilla en <code>app/views/products</code> de esta manera:</p><div class="code_container">
<pre><code class="highlight ruby"><span class="n">render</span> <span class="s2">"products/show"</span>
</code></pre>
<button class="clipboard-button" data-clipboard-text='render "products/show"
'>Copy</button>
</div>
<p>Rails sabe que esta vista pertenece a un controlador diferente debido al carácter de barra inclinado en la cadena. Si desea ser explícito, puede utilizar la opción <code>:template</code> (que era necesaria en Rails 2.2 y versiones anteriores):</p><div class="code_container">
<pre><code class="highlight ruby"><span class="n">render</span> <span class="ss">template: </span><span class="s2">"products/show"</span>
</code></pre>
<button class="clipboard-button" data-clipboard-text='render template: "products/show"
'>Copy</button>
</div>
<h5 id="wrapping-it-up"><a class="anchorlink" href="#wrapping-it-up">2.2.3 Wrapping it up</a></h5><p>Las tres formas anteriores de renderizar (renderizar otra plantilla dentro del controlador, renderizar una plantilla dentro de otro controlador y renderizar un archivo arbitrario en el sistema de archivos) son en realidad variantes de la misma acción.</p><p>De hecho, en la clase BooksController, dentro de la acción de actualización donde queremos renderizar la plantilla de edición si el libro no se actualiza con éxito, todas las siguientes llamadas de renderización mostrarán la plantilla <code>edit.html.erb</code> en el` directorio de vistas / libros:</p><div class="code_container">
<pre><code class="highlight ruby"><span class="n">render</span> <span class="ss">:edit</span>
<span class="n">render</span> <span class="ss">action: :edit</span>
<span class="n">render</span> <span class="s2">"edit"</span>
<span class="n">render</span> <span class="ss">action: </span><span class="s2">"edit"</span>
<span class="n">render</span> <span class="s2">"books/edit"</span>
<span class="n">render</span> <span class="ss">template: </span><span class="s2">"books/edit"</span>
</code></pre>
<button class="clipboard-button" data-clipboard-text='render :edit
render action: :edit
render "edit"
render action: "edit"
render "books/edit"
render template: "books/edit"
'>Copy</button>
</div>
<p>El que use es realmente una cuestión de estilo y convención, pero la regla general es usar el más simple que tenga sentido para el código que está escribiendo.</p><h5 id="using-render-with-inline"><a class="anchorlink" href="#using-render-with-inline">2.2.4 Using <code>render</code> with <code>:inline</code></a></h5><p>El método <code>render</code> puede prescindir de una vista por completo, si está dispuesto a utilizar la opción <code>:inline</code> para proporcionar ERB como parte de la llamada al método. Esto es perfectamente válido:</p><div class="code_container">
<pre><code class="highlight ruby"><span class="n">render</span> <span class="ss">inline: </span><span class="s2">"<% products.each do |p| %><p><%= p.name %></p><% end %>"</span>
</code></pre>
<button class="clipboard-button" data-clipboard-text='render inline: "<% products.each do |p| %><p><%= p.name %></p><% end %>"
'>Copy</button>
</div>
<div class="warning"><p>rara vez hay una buena razón para usar esta opción. Mezclar ERB en sus controladores anula la orientación MVC de Rails y dificultará que otros desarrolladores sigan la lógica de su proyecto. En su lugar, utilice una vista erb separada.</p></div><p>Por defecto, el renderizado en línea usa ERB. Puede forzarlo a usar Builder en su lugar con la opción <code>:type</code>:</p><div class="code_container">
<pre><code class="highlight ruby"><span class="n">render</span> <span class="ss">inline: </span><span class="s2">"xml.p {'Horrid coding practice!'}"</span><span class="p">,</span> <span class="ss">type: :builder</span>
</code></pre>
<button class="clipboard-button" data-clipboard-text="render inline: "xml.p {'Horrid coding practice!'}", type: :builder
">Copy</button>
</div>
<h5 id="rendering-text"><a class="anchorlink" href="#rendering-text">2.2.5 Rendering Text</a></h5><p>Puede enviar texto sin formato, sin ningún tipo de marcado, de vuelta al navegador utilizando
la opción <code>:plain</code> para <code>render</code>:</p><div class="code_container">
<pre><code class="highlight ruby"><span class="n">render</span> <span class="ss">plain: </span><span class="s2">"OK"</span>
</code></pre>
<button class="clipboard-button" data-clipboard-text='render plain: "OK"
'>Copy</button>
</div>
<div class="info"><p>La representación de texto puro es más útil cuando responde a Ajax o
solicitudes de serviciode web que esperan algo diferente a lo apropiado</p></div><div class="note"><p>De manera predeterminada, si usa la opción <code>:plain</code>, el texto se representa sin
utilizando el diseño actual. Si quieres que Rails ponga el texto en el actual
layout, debe agregar la opción <code>layout: true</code> y usar el <code>.text.erb</code>
extensión para el archivo de diseño.</p></div><h5 id="rendering-html"><a class="anchorlink" href="#rendering-html">2.2.6 Rendering HTML</a></h5><p>Puede enviar una cadena HTML al navegador utilizando la opción <code>:html</code> para
<code>render</code>:</p><div class="code_container">
<pre><code class="highlight ruby"><span class="n">render</span> <span class="ss">html: </span><span class="n">helpers</span><span class="p">.</span><span class="nf">tag</span><span class="p">.</span><span class="nf">strong</span><span class="p">(</span><span class="s1">'Not Found'</span><span class="p">)</span>
</code></pre>
<button class="clipboard-button" data-clipboard-text="render html: helpers.tag.strong('Not Found')
">Copy</button>
</div>
<div class="info"><p>esto es útil cuando representa un pequeño fragmento de código HTML.
Sin embargo, es posible que desee considerar moverlo a un archivo de plantilla si el marcado
es complejo.</p></div><div class="note"><p>Al usar la opción <code>html:</code>, las entidades HTML se escaparán si la cadena no está compuesta con API compatibles con <code>html_safe</code>.</p></div><h5 id="rendering-json"><a class="anchorlink" href="#rendering-json">2.2.7 Rendering JSON</a></h5><p>JSON es un formato de datos JavaScript utilizado por muchas bibliotecas Ajax. Rails tiene soporte incorporado para convertir objetos a JSON y renderizar ese JSON en el navegador:</p><div class="code_container">
<pre><code class="highlight ruby"><span class="n">render</span> <span class="ss">json: </span><span class="vi">@product</span>
</code></pre>
<button class="clipboard-button" data-clipboard-text="render json: @product
">Copy</button>
</div>
<div class="info"><p>No es necesario llamar a <code>to_json</code> en el objeto que desea renderizar. Si usa la opción <code>:json</code>, <code>render</code> llamará automáticamente a <code>to_json</code> por usted.</p></div><h5 id="rendering-xml"><a class="anchorlink" href="#rendering-xml">2.2.8 Rendering XML</a></h5><p>Rails también tiene soporte incorporado para convertir objetos a XML y hacer que ese XML vuelva a la persona que llama:</p><div class="code_container">
<pre><code class="highlight ruby"><span class="n">render</span> <span class="ss">xml: </span><span class="vi">@product</span>
</code></pre>
<button class="clipboard-button" data-clipboard-text="render xml: @product
">Copy</button>
</div>
<div class="info"><p>No necesita llamar a <code>to_xml</code> en el objeto que desea representar. Si usa la opción <code>:xml</code>, <code>render</code> llamará automáticamente a <code>to_xml</code> por usted.</p></div><h5 id="rendering-vanilla-javascript"><a class="anchorlink" href="#rendering-vanilla-javascript">2.2.9 Rendering Vanilla JavaScript</a></h5><p>Los rieles pueden representar JavaScript vainilla:</p><div class="code_container">
<pre><code class="highlight ruby"><span class="n">render</span> <span class="ss">js: </span><span class="s2">"alert('Hello Rails');"</span>
</code></pre>
<button class="clipboard-button" data-clipboard-text="render js: "alert('Hello Rails');"
">Copy</button>
</div>
<p>Esto enviará la cadena suministrada al navegador con un tipo MIME de <code>text/javascript</code>.</p><h5 id="rendering-raw-body"><a class="anchorlink" href="#rendering-raw-body">2.2.10 Rendering raw body</a></h5><p>Puede enviar un contenido sin procesar al navegador, sin configurar ningún contenido.
type, usando la opción <code>:body</code> para<code>render</code>:</p><div class="code_container">
<pre><code class="highlight ruby"><span class="n">render</span> <span class="ss">body: </span><span class="s2">"raw"</span>
</code></pre>
<button class="clipboard-button" data-clipboard-text='render body: "raw"
'>Copy</button>
</div>
<div class="info"><p>esta opción debe usarse solo si no le importa el tipo de contenido de
la respuesta. El uso de <code>:plain</code> o <code>:html</code> podría ser más apropiado para la mayoría de
hora.</p></div><div class="note"><p>A menos que se anule, su respuesta devuelta de esta opción de procesamiento será
<code>text/plain</code>, ya que ese es el tipo de contenido predeterminado de la respuesta Action Dispatch.</p></div><h5 id="rendering-raw-file"><a class="anchorlink" href="#rendering-raw-file">2.2.11 Rendering raw file</a></h5><p>Los rieles pueden representar un archivo sin formato desde una ruta absoluta. Esto es útil para
renderización condicional de archivos estáticos como páginas de error.</p><div class="code_container">
<pre><code class="highlight ruby"><span class="n">render</span> <span class="ss">file: </span><span class="s2">"</span><span class="si">#{</span><span class="no">Rails</span><span class="p">.</span><span class="nf">root</span><span class="si">}</span><span class="s2">/public/404.html"</span><span class="p">,</span> <span class="ss">layout: </span><span class="kp">false</span>
</code></pre>
<button class="clipboard-button" data-clipboard-text='render file: "#{Rails.root}/public/404.html", layout: false
'>Copy</button>
</div>
<p>Esto representa el archivo sin formato (no es compatible con ERB u otros controladores). Por
por defecto se representa dentro del diseño actual.</p><div class="warning"><p>El uso de la opción <code>:file</code> en combinación con la entrada de los usuarios puede provocar problemas de seguridad
ya que un atacante podría usar esta acción para acceder a archivos confidenciales de seguridad en su sistema de archivos.</p></div><div class="info"><p><code>send_file</code> suele ser una opción mejor y más rápida si no se requiere un diseño.</p></div><h5 id="rendering-objects"><a class="anchorlink" href="#rendering-objects">2.2.12 Rendering objects</a></h5><p>Los rieles pueden representar objetos que respondan a <code>:render_in</code>.</p><div class="code_container">
<pre><code class="highlight ruby"><span class="n">render</span> <span class="no">MyComponent</span><span class="p">.</span><span class="nf">new</span>
</code></pre>
<button class="clipboard-button" data-clipboard-text="render MyComponent.new
">Copy</button>
</div>
<p>Esto llama a <code>render_in</code> en el objeto proporcionado con el contexto de vista actual.</p><h5 id="options-for-render"><a class="anchorlink" href="#options-for-render">2.2.13 Options for <code>render</code></a></h5><p>Las llamadas al método <code>render</code> generalmente aceptan seis opciones:</p>
<ul>
<li><code>:content_type</code></li>
<li><code>:layout</code></li>
<li><code>:location</code></li>
<li><code>:status</code></li>
<li><code>:formats</code></li>
<li><code>:variants</code></li>
</ul>
<h6 id="the-content-type-option"><a class="anchorlink" href="#the-content-type-option">2.2.13.1 The <code>:content_type</code> Option</a></h6><p>Por defecto, Rails servirá los resultados de una operación de renderizado con el tipo de contenido MIME de <code>text / html</code> (o<code>application / json</code> si usa la opción <code>: json</code>, o<code>application / xml</code> para el <code>: opción xml</code>). Hay momentos en los que le gustaría cambiar esto, y puede hacerlo configurando la opción <code>:content_type</code>:</p><div class="code_container">
<pre><code class="highlight ruby"><span class="n">render</span> <span class="ss">template: </span><span class="s2">"feed"</span><span class="p">,</span> <span class="ss">content_type: </span><span class="s2">"application/rss"</span>
</code></pre>
<button class="clipboard-button" data-clipboard-text='render template: "feed", content_type: "application/rss"
'>Copy</button>
</div>
<h6 id="the-layout-option"><a class="anchorlink" href="#the-layout-option">2.2.13.2 The <code>:layout</code> Option</a></h6><p>Con la mayoría de las opciones para "renderizar", el contenido renderizado se muestra como parte del diseño actual. Aprenderá más sobre los diseños y cómo usarlos más adelante en esta guía.</p><p>Puedes usar la opción <code>:layout</code> para decirle a Rails que use un archivo específico como diseño para la acción actual:</p><div class="code_container">
<pre><code class="highlight ruby"><span class="n">render</span> <span class="ss">layout: </span><span class="s2">"special_layout"</span>
</code></pre>
<button class="clipboard-button" data-clipboard-text='render layout: "special_layout"
'>Copy</button>
</div>
<p>También puedes decirle a Rails que renderice sin ningún diseño:</p><div class="code_container">
<pre><code class="highlight ruby"><span class="n">render</span> <span class="ss">layout: </span><span class="kp">false</span>
</code></pre>
<button class="clipboard-button" data-clipboard-text="render layout: false
">Copy</button>
</div>
<h6 id="the-location-option"><a class="anchorlink" href="#the-location-option">2.2.13.3 The <code>:location</code> Option</a></h6><p>Puede usar la opción <code>:location</code> para establecer el encabezado HTTP <code>Location</code>:</p><div class="code_container">
<pre><code class="highlight ruby"><span class="n">render</span> <span class="ss">xml: </span><span class="n">photo</span><span class="p">,</span> <span class="ss">location: </span><span class="n">photo_url</span><span class="p">(</span><span class="n">photo</span><span class="p">)</span>
</code></pre>
<button class="clipboard-button" data-clipboard-text="render xml: photo, location: photo_url(photo)
">Copy</button>
</div>
<h6 id="the-status-option"><a class="anchorlink" href="#the-status-option">2.2.13.4 The <code>:status</code> Option</a></h6><p>Rails generará automáticamente una respuesta con el código de estado HTTP correcto (en la mayoría de los casos, esto es <code>200 OK</code>). Puede usar la opción <code>:status</code> para cambiar esto:</p><div class="code_container">
<pre><code class="highlight ruby"><span class="n">render</span> <span class="ss">status: </span><span class="mi">500</span>
<span class="n">render</span> <span class="ss">status: :forbidden</span>
</code></pre>
<button class="clipboard-button" data-clipboard-text="render status: 500
render status: :forbidden
">Copy</button>
</div>
<p>Rails comprende tanto los códigos de estado numéricos como los símbolos correspondientes que se muestran a continuación.</p>
<table>
<thead>
<tr>
<th>Response Class</th>
<th>HTTP Status Code</th>
<th>Symbol</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Informational</strong></td>
<td>100</td>
<td>:continue</td>
</tr>
<tr>
<td></td>
<td>101</td>
<td>:switching_protocols</td>
</tr>
<tr>
<td></td>
<td>102</td>
<td>:processing</td>
</tr>
<tr>
<td><strong>Success</strong></td>
<td>200</td>
<td>:ok</td>
</tr>
<tr>
<td></td>
<td>201</td>
<td>:created</td>
</tr>
<tr>
<td></td>
<td>202</td>
<td>:accepted</td>
</tr>
<tr>
<td></td>
<td>203</td>
<td>:non_authoritative_information</td>
</tr>
<tr>
<td></td>
<td>204</td>
<td>:no_content</td>
</tr>
<tr>
<td></td>
<td>205</td>
<td>:reset_content</td>
</tr>
<tr>
<td></td>
<td>206</td>
<td>:partial_content</td>
</tr>
<tr>
<td></td>
<td>207</td>
<td>:multi_status</td>
</tr>
<tr>
<td></td>
<td>208</td>
<td>:already_reported</td>
</tr>
<tr>
<td></td>
<td>226</td>
<td>:im_used</td>
</tr>
<tr>
<td><strong>Redirection</strong></td>
<td>300</td>
<td>:multiple_choices</td>
</tr>
<tr>
<td></td>
<td>301</td>
<td>:moved_permanently</td>
</tr>
<tr>
<td></td>
<td>302</td>
<td>:found</td>
</tr>
<tr>
<td></td>
<td>303</td>
<td>:see_other</td>
</tr>
<tr>
<td></td>
<td>304</td>
<td>:not_modified</td>
</tr>
<tr>
<td></td>
<td>305</td>
<td>:use_proxy</td>
</tr>
<tr>
<td></td>
<td>307</td>
<td>:temporary_redirect</td>
</tr>
<tr>
<td></td>
<td>308</td>
<td>:permanent_redirect</td>
</tr>
<tr>
<td><strong>Client Error</strong></td>
<td>400</td>
<td>:bad_request</td>
</tr>
<tr>
<td></td>
<td>401</td>
<td>:unauthorized</td>
</tr>
<tr>
<td></td>
<td>402</td>
<td>:payment_required</td>
</tr>
<tr>
<td></td>
<td>403</td>
<td>:forbidden</td>
</tr>
<tr>
<td></td>
<td>404</td>
<td>:not_found</td>
</tr>
<tr>
<td></td>
<td>405</td>
<td>:method_not_allowed</td>
</tr>
<tr>
<td></td>
<td>406</td>
<td>:not_acceptable</td>
</tr>
<tr>
<td></td>
<td>407</td>
<td>:proxy_authentication_required</td>
</tr>
<tr>
<td></td>
<td>408</td>
<td>:request_timeout</td>
</tr>
<tr>
<td></td>
<td>409</td>
<td>:conflict</td>
</tr>
<tr>
<td></td>
<td>410</td>
<td>:gone</td>
</tr>
<tr>
<td></td>
<td>411</td>
<td>:length_required</td>
</tr>
<tr>
<td></td>
<td>412</td>
<td>:precondition_failed</td>
</tr>
<tr>
<td></td>
<td>413</td>
<td>:payload_too_large</td>
</tr>
<tr>
<td></td>
<td>414</td>
<td>:uri_too_long</td>
</tr>
<tr>
<td></td>
<td>415</td>
<td>:unsupported_media_type</td>
</tr>
<tr>
<td></td>
<td>416</td>
<td>:range_not_satisfiable</td>
</tr>
<tr>
<td></td>
<td>417</td>
<td>:expectation_failed</td>
</tr>
<tr>
<td></td>
<td>421</td>
<td>:misdirected_request</td>
</tr>
<tr>
<td></td>
<td>422</td>
<td>:unprocessable_entity</td>
</tr>
<tr>
<td></td>
<td>423</td>
<td>:locked</td>
</tr>
<tr>
<td></td>
<td>424</td>
<td>:failed_dependency</td>
</tr>
<tr>
<td></td>
<td>426</td>
<td>:upgrade_required</td>
</tr>
<tr>
<td></td>
<td>428</td>
<td>:precondition_required</td>
</tr>
<tr>
<td></td>
<td>429</td>
<td>:too_many_requests</td>
</tr>
<tr>
<td></td>
<td>431</td>
<td>:request_header_fields_too_large</td>
</tr>
<tr>
<td></td>
<td>451</td>
<td>:unavailable_for_legal_reasons</td>
</tr>
<tr>
<td><strong>Server Error</strong></td>
<td>500</td>
<td>:internal_server_error</td>
</tr>
<tr>
<td></td>
<td>501</td>
<td>:not_implemented</td>
</tr>
<tr>
<td></td>
<td>502</td>
<td>:bad_gateway</td>
</tr>
<tr>
<td></td>
<td>503</td>
<td>:service_unavailable</td>
</tr>
<tr>
<td></td>
<td>504</td>
<td>:gateway_timeout</td>
</tr>
<tr>
<td></td>
<td>505</td>
<td>:http_version_not_supported</td>
</tr>
<tr>
<td></td>
<td>506</td>
<td>:variant_also_negotiates</td>
</tr>
<tr>
<td></td>
<td>507</td>
<td>:insufficient_storage</td>
</tr>
<tr>
<td></td>
<td>508</td>
<td>:loop_detected</td>
</tr>
<tr>
<td></td>
<td>510</td>
<td>:not_extended</td>
</tr>
<tr>
<td></td>
<td>511</td>
<td>:network_authentication_required</td>
</tr>
</tbody>
</table>
<div class="note"><p>Si intenta renderizar contenido junto con un código de estado sin contenido
(100-199, 204, 205 o 304), se eliminará de la respuesta.</p></div><h6 id="the-formats-option"><a class="anchorlink" href="#the-formats-option">2.2.13.5 The <code>:formats</code> Option</a></h6><p>Rails usa el formato especificado en la solicitud (o <code>:html</code> por defecto). Usted puede
cambie esto pasando la opción <code>:formats</code> con un símbolo o una matriz:</p><div class="code_container">
<pre><code class="highlight ruby"><span class="n">render</span> <span class="ss">formats: :xml</span>
<span class="n">render</span> <span class="ss">formats: </span><span class="p">[</span><span class="ss">:json</span><span class="p">,</span> <span class="ss">:xml</span><span class="p">]</span>
</code></pre>
<button class="clipboard-button" data-clipboard-text="render formats: :xml
render formats: [:json, :xml]
">Copy</button>
</div>
<p>Si no existe una plantilla con el formato especificado, se genera un error <code>ActionView::MissingTemplate</code>.</p><h6 id="the-variants-option"><a class="anchorlink" href="#the-variants-option">2.2.13.6 The <code>:variants</code> Option</a></h6><p>Esto le dice a Rails que busque variaciones de la plantilla del mismo formato.
Puede especificar una lista de variantes pasando la opción <code>:variants</code> con un símbolo o una matriz.</p><p>Un ejemplo de uso sería este.</p><div class="code_container">
<pre><code class="highlight ruby"><span class="c1"># called in HomeController#index</span>
<span class="n">render</span> <span class="ss">variants: </span><span class="p">[</span><span class="ss">:mobile</span><span class="p">,</span> <span class="ss">:desktop</span><span class="p">]</span>
</code></pre>
<button class="clipboard-button" data-clipboard-text="# called in HomeController#index
render variants: [:mobile, :desktop]
">Copy</button>
</div>
<p>Con este conjunto de variantes, Rails buscará el siguiente conjunto de plantillas y utilizará la primera que exista.</p>
<ul>
<li><code>app/views/home/index.html+mobile.erb</code></li>
<li><code>app/views/home/index.html+desktop.erb</code></li>
<li><code>app/views/home/index.html.erb</code></li>
</ul>
<p>Si no existe una plantilla con el formato especificado, se genera un error <code>ActionView::MissingTemplate</code>.</p><p>En lugar de configurar la variante en la llamada de renderizado, también puede configurarla en el objeto de solicitud en la acción de su controlador.</p><div class="code_container">
<pre><code class="highlight ruby"><span class="k">def</span> <span class="nf">index</span>
<span class="n">request</span><span class="p">.</span><span class="nf">variant</span> <span class="o">=</span> <span class="n">determine_variant</span>
<span class="k">end</span>
<span class="kp">private</span>
<span class="k">def</span> <span class="nf">determine_variant</span>
<span class="n">variant</span> <span class="o">=</span> <span class="kp">nil</span>
<span class="c1"># some code to determine the variant(s) to use</span>
<span class="n">variant</span> <span class="o">=</span> <span class="ss">:mobile</span> <span class="k">if</span> <span class="n">session</span><span class="p">[</span><span class="ss">:use_mobile</span><span class="p">]</span>
<span class="n">variant</span>
<span class="k">end</span>
</code></pre>
<button class="clipboard-button" data-clipboard-text="def index
request.variant = determine_variant
end
private
def determine_variant
variant = nil
# some code to determine the variant(s) to use
variant = :mobile if session[:use_mobile]
variant
end
">Copy</button>
</div>
<h5 id="finding-layouts"><a class="anchorlink" href="#finding-layouts">2.2.14 Finding Layouts</a></h5><p>Para encontrar el diseño actual, Rails primero busca un archivo en <code>app/views/layouts</code> con el mismo nombre base que el controlador. Por ejemplo, las acciones de renderizado de la clase <code>PhotosController</code> usarán <code>app/views/layouts/photos.html.erb</code> (o <code>app/views/layouts/photos.builder</code>). Si no existe un diseño específico del controlador, Rails usará <code>app/views/layouts/application.html.erb</code> o <code>app/views/layouts/application.builder</code>. Si no hay un diseño <code>.erb</code>, Rails usará un diseño <code>.builder</code> si existe. Rails también proporciona varias formas de asignar diseños específicos de manera más precisa a controladores y acciones individuales.</p><h6 id="specifying-layouts-for-controllers"><a class="anchorlink" href="#specifying-layouts-for-controllers">2.2.14.1 Specifying Layouts for Controllers</a></h6><p>Puede anular las convenciones de diseño predeterminadas en sus controladores utilizando la declaración <code>layout</code>. Por ejemplo:</p><div class="code_container">
<pre><code class="highlight ruby"><span class="k">class</span> <span class="nc">ProductsController</span> <span class="o"><</span> <span class="no">ApplicationController</span>
<span class="n">layout</span> <span class="s2">"inventory"</span>
<span class="c1">#...</span>
<span class="k">end</span>
</code></pre>
<button class="clipboard-button" data-clipboard-text='class ProductsController < ApplicationController
layout "inventory"
#...
end
'>Copy</button>
</div>
<p>Con esta declaración, todas las vistas generadas por <code>ProductsController</code> usarán <code>app/views/layouts/Inventory.html.erb</code> como su diseño.</p><p>Para asignar un diseño específico para toda la aplicación, use una declaración de diseño en su clase ApplicationController:</p><div class="code_container">
<pre><code class="highlight ruby"><span class="k">class</span> <span class="nc">ApplicationController</span> <span class="o"><</span> <span class="no">ActionController</span><span class="o">::</span><span class="no">Base</span>
<span class="n">layout</span> <span class="s2">"main"</span>
<span class="c1">#...</span>
<span class="k">end</span>
</code></pre>
<button class="clipboard-button" data-clipboard-text='class ApplicationController < ActionController::Base
layout "main"
#...
end
'>Copy</button>
</div>
<p>Con esta declaración, todas las vistas en toda la aplicación usarán <code>app/views/layouts/main.html.erb</code> para su diseño.</p><h6 id="choosing-layouts-at-runtime"><a class="anchorlink" href="#choosing-layouts-at-runtime">2.2.14.2 Choosing Layouts at Runtime</a></h6><p>Puede utilizar un símbolo para aplazar la elección del diseño hasta que se procese una solicitud:</p><div class="code_container">
<pre><code class="highlight ruby"><span class="k">class</span> <span class="nc">ProductsController</span> <span class="o"><</span> <span class="no">ApplicationController</span>
<span class="n">layout</span> <span class="ss">:products_layout</span>
<span class="k">def</span> <span class="nf">show</span>
<span class="vi">@product</span> <span class="o">=</span> <span class="no">Product</span><span class="p">.</span><span class="nf">find</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="ss">:id</span><span class="p">])</span>
<span class="k">end</span>
<span class="kp">private</span>
<span class="k">def</span> <span class="nf">products_layout</span>
<span class="vi">@current_user</span><span class="p">.</span><span class="nf">special?</span> <span class="p">?</span> <span class="s2">"special"</span> <span class="p">:</span> <span class="s2">"products"</span>
<span class="k">end</span>
<span class="k">end</span>
</code></pre>
<button class="clipboard-button" data-clipboard-text='class ProductsController < ApplicationController
layout :products_layout
def show
@product = Product.find(params[:id])
end
private
def products_layout
@current_user.special? ? "special" : "products"
end
end
'>Copy</button>
</div>
<p>Ahora, si el usuario actual es un usuario especial, obtendrá un diseño especial al ver un producto.</p><p>Incluso puede utilizar un método en línea, como Proc, para determinar el diseño. Por ejemplo, si pasa un objeto Proc, el bloque que le da a Proc recibirá la instancia del <code>controller</code>, por lo que el diseño se puede determinar en función de la solicitud actual:</p><div class="code_container">
<pre><code class="highlight ruby"><span class="k">class</span> <span class="nc">ProductsController</span> <span class="o"><</span> <span class="no">ApplicationController</span>
<span class="n">layout</span> <span class="no">Proc</span><span class="p">.</span><span class="nf">new</span> <span class="p">{</span> <span class="o">|</span><span class="n">controller</span><span class="o">|</span> <span class="n">controller</span><span class="p">.</span><span class="nf">request</span><span class="p">.</span><span class="nf">xhr?</span> <span class="p">?</span> <span class="s2">"popup"</span> <span class="p">:</span> <span class="s2">"application"</span> <span class="p">}</span>
<span class="k">end</span>
</code></pre>
<button class="clipboard-button" data-clipboard-text='class ProductsController < ApplicationController
layout Proc.new { |controller| controller.request.xhr? ? "popup" : "application" }
end
'>Copy</button>
</div>
<h6 id="conditional-layouts"><a class="anchorlink" href="#conditional-layouts">2.2.14.3 Conditional Layouts</a></h6><p>Los diseños especificados en el nivel del controlador admiten las opciones <code>:only</code> y <code>:except</code>. Estas opciones toman un nombre de método o una matriz de nombres de métodos, correspondientes a los nombres de métodos dentro del controlador:</p><div class="code_container">
<pre><code class="highlight ruby"><span class="k">class</span> <span class="nc">ProductsController</span> <span class="o"><</span> <span class="no">ApplicationController</span>
<span class="n">layout</span> <span class="s2">"product"</span><span class="p">,</span> <span class="ss">except: </span><span class="p">[</span><span class="ss">:index</span><span class="p">,</span> <span class="ss">:rss</span><span class="p">]</span>
<span class="k">end</span>
</code></pre>
<button class="clipboard-button" data-clipboard-text='class ProductsController < ApplicationController
layout "product", except: [:index, :rss]
end
'>Copy</button>
</div>
<p>Con esta declaración, el diseño <code>product</code> se usaría para todo menos los métodos <code>rss</code> e <code>index</code>.</p><h6 id="layout-inheritance"><a class="anchorlink" href="#layout-inheritance">2.2.14.4 Layout Inheritance</a></h6><p>Las declaraciones de diseño caen en cascada hacia abajo en la jerarquía, y las declaraciones de diseño más específicas siempre anulan las más generales. Por ejemplo:</p>
<ul>
<li>
<p><code>application_controller.rb</code></p>
<div class="code_container">
<pre><code class="highlight ruby"><span class="k">class</span> <span class="nc">ApplicationController</span> <span class="o"><</span> <span class="no">ActionController</span><span class="o">::</span><span class="no">Base</span>
<span class="n">layout</span> <span class="s2">"main"</span>
<span class="k">end</span>
</code></pre>
<button class="clipboard-button" data-clipboard-text='class ApplicationController < ActionController::Base
layout "main"
end
'>Copy</button>
</div>
</li>
<li>
<p><code>articles_controller.rb</code></p>
<div class="code_container">
<pre><code class="highlight ruby"><span class="k">class</span> <span class="nc">ArticlesController</span> <span class="o"><</span> <span class="no">ApplicationController</span>
<span class="k">end</span>
</code></pre>
<button class="clipboard-button" data-clipboard-text="class ArticlesController < ApplicationController
end
">Copy</button>
</div>
</li>
<li>
<p><code>special_articles_controller.rb</code></p>
<div class="code_container">
<pre><code class="highlight ruby"><span class="k">class</span> <span class="nc">SpecialArticlesController</span> <span class="o"><</span> <span class="no">ArticlesController</span>
<span class="n">layout</span> <span class="s2">"special"</span>
<span class="k">end</span>
</code></pre>
<button class="clipboard-button" data-clipboard-text='class SpecialArticlesController < ArticlesController
layout "special"
end
'>Copy</button>
</div>
</li>
<li>
<p><code>old_articles_controller.rb</code></p>
<div class="code_container">
<pre><code class="highlight ruby"><span class="k">class</span> <span class="nc">OldArticlesController</span> <span class="o"><</span> <span class="no">SpecialArticlesController</span>
<span class="n">layout</span> <span class="kp">false</span>
<span class="k">def</span> <span class="nf">show</span>
<span class="vi">@article</span> <span class="o">=</span> <span class="no">Article</span><span class="p">.</span><span class="nf">find</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="ss">:id</span><span class="p">])</span>
<span class="k">end</span>
<span class="k">def</span> <span class="nf">index</span>
<span class="vi">@old_articles</span> <span class="o">=</span> <span class="no">Article</span><span class="p">.</span><span class="nf">older</span>
<span class="n">render</span> <span class="ss">layout: </span><span class="s2">"old"</span>
<span class="k">end</span>
<span class="c1"># ...</span>
<span class="k">end</span>
</code></pre>
<button class="clipboard-button" data-clipboard-text='class OldArticlesController < SpecialArticlesController
layout false
def show
@article = Article.find(params[:id])
end
def index
@old_articles = Article.older
render layout: "old"
end
# ...
end
'>Copy</button>
</div>
</li>
</ul>
<p>En esta aplication:</p>
<ul>
<li>En general, las vistas se renderizarán en el diseño <code>main</code>
</li>