Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Newer
Older
100644 1919 lines (1330 sloc) 55.54 kB
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
1 = Sinatra
1abac32 @rkh Add note to all README translations saying: 'Important Note: This doc…
rkh authored
2 <i>Atención: Este documento es una traducción de la versión en inglés y puede estar desactualizado.</i>
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
3
52d4311 @gnandretta improves Spanish README
gnandretta authored
4 Sinatra es un DSL para crear aplicaciones web rápidamente en Ruby con un mínimo
5 esfuerzo:
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
6
7 # miapp.rb
8 require 'sinatra'
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
9
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
10 get '/' do
11 'Hola mundo!'
12 end
13
52d4311 @gnandretta improves Spanish README
gnandretta authored
14 Instalá la gem y ejecutá la aplicación con:
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
15
3a25d98 @rkh Adjust examples in French and Spanish READMEs.
rkh authored
16 gem install sinatra
17 ruby -rubygems miapp.rb
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
18
19 Podés verla en: http://localhost:4567
20
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
21 Es recomendable además ejecutar <tt>gem install thin</tt>, ya que Sinatra lo va
22 a utilizar cuando esté disponible.
23
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
24 == Rutas
25
52d4311 @gnandretta improves Spanish README
gnandretta authored
26 En Sinatra, una ruta está compuesta por un método HTTP y un patrón de una URL.
27 Cada ruta se asocia con un bloque:
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
28
29 get '/' do
30 .. mostrar algo ..
31 end
32
33 post '/' do
34 .. crear algo ..
35 end
36
37 put '/' do
38 .. actualizar algo ..
39 end
40
41 delete '/' do
42 .. aniquilar algo ..
43 end
44
78bb1d9 @gnandretta update REAMDE.es.rdoc
gnandretta authored
45 options '/' do
46 .. informar algo ..
47 end
48
49
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
50 Las rutas son comparadas en el orden en el que son definidas. La primer ruta
51 que coincide con la petición es invocada.
52
53 Los patrones de las rutas pueden incluir parámetros nombrados, accesibles a
54 través de el hash <tt>params</tt>:
55
56 get '/hola/:nombre' do
57 # coincide con "GET /hola/foo" y "GET /hola/bar"
52d4311 @gnandretta improves Spanish README
gnandretta authored
58 # params[:nombre] es 'foo' o 'bar'
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
59 "Hola #{params[:nombre]}!"
60 end
61
62 También podés acceder a los parámetros nombrados usando parámetros de bloque:
63
64 get '/hola/:nombre' do |n|
65 "Hola #{n}!"
66 end
67
52d4311 @gnandretta improves Spanish README
gnandretta authored
68 Los patrones de ruta también pueden incluir parámetros splat (o wildcard),
79032f7 @gnandretta sync spanish readme, fixes #204
gnandretta authored
69 accesibles a través del arreglo <tt>params[:splat]</tt>:
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
70
71 get '/decir/*/al/*' do
72 # coincide con /decir/hola/al/mundo
73 params[:splat] # => ["hola", "mundo"]
74 end
75
76 get '/descargar/*.*' do
77 # coincide con /descargar/path/al/archivo.xml
78 params[:splat] # => ["path/al/archivo", "xml"]
79 end
80
52d4311 @gnandretta improves Spanish README
gnandretta authored
81 Rutas con Expresiones Regulares:
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
82
83 get %r{/hola/([\w]+)} do
84 "Hola, #{params[:captures].first}!"
85 end
86
87 O con un parámetro de bloque:
88
89 get %r{/hola/([\w]+)} do |c|
90 "Hola, #{c}!"
91 end
92
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
93 === Condiciones
94
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
95 Las rutas pueden incluir una variedad de condiciones de selección, como por
52d4311 @gnandretta improves Spanish README
gnandretta authored
96 ejemplo el user agent:
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
97
98 get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
52d4311 @gnandretta improves Spanish README
gnandretta authored
99 "Estás usando la versión de Songbird #{params[:agent][0]}"
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
100 end
101
102 get '/foo' do
103 # Coincide con browsers que no sean songbird
104 end
105
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
106 Otras condiciones disponibles son +host_name+ y +provides+:
107
108 get '/', :host_name => /^admin\./ do
109 "Área de Administración, Acceso denegado!"
110 end
111
112 get '/', :provides => 'html' do
113 haml :index
114 end
115
116 get '/', :provides => ['rss', 'atom', 'xml'] do
117 builder :feed
118 end
119
120 Podés definir tus propias condiciones fácilmente:
121
122 set(:probabilidad) { |valor| condition { rand <= valor } }
123
124 get '/gana_un_auto', :probabilidad => 0.1 do
125 "Ganaste!"
126 end
127
128 get '/gana_un_auto' do
129 "Lo siento, perdiste."
130 end
131
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
132 === Valores de Retorno
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
133
134 El valor de retorno de un bloque de ruta determina al menos el cuerpo de la
135 respuesta que se le pasa al cliente HTTP o al siguiente middleware en la pila
136 de Rack. Lo más común es que sea un string, como en los ejemplos anteriores.
137 Sin embargo, otros valor también son aceptados.
138
139 Podés devolver cualquier objeto que sea una respuesta Rack válida, un objeto
140 que represente el cuerpo de una respuesta Rack o un código de estado HTTP:
141
142 * Un arreglo con tres elementos: <tt>[estado (Fixnum), cabeceras (Hash), cuerpo de la respuesta (responde a #each)]</tt>
143 * Un arreglo con dos elementos: <tt>[estado (Fixnum), cuerpo de la respuesta (responde a #each)]</tt>
144 * Un objeto que responde a <tt>#each</tt> y que le pasa únicamente strings al bloque dado
145 * Un Fixnum representando el código de estado
146
147 De esa manera podemos, por ejemplo, implementar fácilmente un streaming:
148
149 class Stream
150 def each
151 100.times { |i| yield "#{i}\n" }
152 end
153 end
154
155 get('/') { Stream.new }
156
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
157 === Comparadores de Rutas Personalizados
158
159 Como se mostró anteriormente, Sinatra permite utilizar Strings y expresiones
160 regulares para definir las rutas. Sin embargo, la cosa no termina ahí. Podés
161 definir tus propios comparadores muy fácilmente:
162
163 class PattronCualquieraMenos
164 Match = Struct.new(:captures)
165
166 def initialize(excepto)
167 @excepto = excepto
79032f7 @gnandretta sync spanish readme, fixes #204
gnandretta authored
168 @capturas = Match.new([])
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
169 end
170
171 def match(str)
79032f7 @gnandretta sync spanish readme, fixes #204
gnandretta authored
172 @capturas unless @excepto === str
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
173 end
174 end
175
176 def cualquiera_menos(patron)
177 PatronCualquieraMenos.new(patron)
178 end
179
180 get cualquiera_menos("/index") do
181 # ...
182 end
183
184 Tené en cuenta que el ejemplo anterior es un poco rebuscado. Un resultado
185 similar puede conseguirse más sencillamente:
186
187 get // do
188 pass if request.path_info == "/index"
189 # ...
190 end
191
192 O, usando un lookahead negativo:
193
194 get %r{^(?!/index$)} do
195 # ...
196 end
197
54384ec @gnandretta use same capitalization for all headings in spanish readme
gnandretta authored
198 == Archivos Estáticos
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
199
200 Los archivos estáticos son servidos desde el directorio público
201 <tt>./public</tt>. Podés especificar una ubicación diferente ajustando la
202 opción <tt>:public</tt>:
203
204 set :public, File.dirname(__FILE__) + '/estaticos'
205
206 Notá que el nombre del directorio público no está incluido en la URL. Por
207 ejemplo, el archivo <tt>./public/css/style.css</tt> se accede a través de
208 <tt>http://ejemplo.com/css/style.css</tt>.
209
210 == Vistas / Plantillas
211
52d4311 @gnandretta improves Spanish README
gnandretta authored
212 Se asume que las plantillas están ubicadas directamente bajo el directorio
213 <tt>./views</tt>. Para usar un directorio de vistas diferente:
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
214
215 set :views, File.dirname(__FILE__) + '/plantillas'
216
217 Es importante acordarse que siempre tenés que referenciar a las plantillas con
218 símbolos, incluso cuando se encuentran en un subdirectorio (en este caso tenés
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
219 que usar <tt>:'subdir/plantilla'</tt>). Tenés que usar un símbolo porque los
220 métodos de renderización van a renderizar directamente cualquier string que se
221 les pase como argumento.
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
222
223 === Plantillas Haml
224
d663ea1 @gnandretta spanish readme formatting adjustments
gnandretta authored
225 La gem/librería <tt>haml</tt> es necesaria para para renderizar plantillas HAML:
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
226
314a98f @rkh Remove uneccessary # from READMEs.
rkh authored
227 # Vas a necesitar requerir haml en tu app
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
228 require 'haml'
229
230 get '/' do
231 haml :index
232 end
233
234 Renderiza <tt>./views/index.haml</tt>.
235
236 Las {opciones de Haml}[http://haml-lang.com/docs/yardoc/file.HAML_REFERENCE.html#options]
237 pueden ser ajustadas globalmente a través de las configuraciones de Sinatra,
238 ver {Opciones y Configuraciones}[http://www.sinatrarb.com/configuration.html],
239 y reemplazadas individualmente.
240
3a25d98 @rkh Adjust examples in French and Spanish READMEs.
rkh authored
241 set :haml, :format => :html5 # el formato por defecto de Haml es :xhtml
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
242
243 get '/' do
3a25d98 @rkh Adjust examples in French and Spanish READMEs.
rkh authored
244 haml :index, :format => :html4 # reemplazado
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
245 end
246
247 === Plantillas Erb
248
314a98f @rkh Remove uneccessary # from READMEs.
rkh authored
249 # Vas a necesitar requerir erb en tu app
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
250 require 'erb'
251
252 get '/' do
253 erb :index
254 end
255
256 Renderiza <tt>./views/index.erb</tt>
257
8a49d5b @gnandretta explain how to replace ERB with Erubis in spanish readme
gnandretta authored
258 === Plantillas Erubis
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
259
d663ea1 @gnandretta spanish readme formatting adjustments
gnandretta authored
260 La gem/librería <tt>erubis</tt> es necesaria para renderizar plantillas Erubis:
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
261
314a98f @rkh Remove uneccessary # from READMEs.
rkh authored
262 # Vas a necesitar requerir erubis en tu app
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
263 require 'erubis'
264
265 get '/' do
266 erubis :index
267 end
268
8a49d5b @gnandretta explain how to replace ERB with Erubis in spanish readme
gnandretta authored
269 Renderiza <tt>./views/index.erubis</tt>.
270
271 También es posible reemplazar Erb con Erubis:
272
273 require 'erubis'
274 Tilt.register :erb, Tilt[:erubis]
275
276 get '/' do
277 erb :index
278 end
279
280 Renderiza <tt>./views/index.erb</tt> con Erubis.
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
281
282 === Plantillas Builder
283
d663ea1 @gnandretta spanish readme formatting adjustments
gnandretta authored
284 La gem/librería <tt>builder</tt> es necesaria para renderizar plantillas
285 builder:
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
286
314a98f @rkh Remove uneccessary # from READMEs.
rkh authored
287 # Vas a necesitar requerir builder en tu app
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
288 require 'builder'
289
290 get '/' do
291 builder :index
292 end
293
294 Renderiza <tt>./views/index.builder</tt>.
295
dd81da1 @rkh Add nokogiri helper method. Tilt supports Nokogiri for quite some tim…
rkh authored
296 === Plantillas Nokogiri
297
d663ea1 @gnandretta spanish readme formatting adjustments
gnandretta authored
298 La gem/librería <tt>nokogiri</tt> es necesaria para renderizar plantillas
299 nokogiri:
dd81da1 @rkh Add nokogiri helper method. Tilt supports Nokogiri for quite some tim…
rkh authored
300
314a98f @rkh Remove uneccessary # from READMEs.
rkh authored
301 # Vas a necesitar requerir nokogiri en tu app
dd81da1 @rkh Add nokogiri helper method. Tilt supports Nokogiri for quite some tim…
rkh authored
302 require 'nokogiri'
303
304 get '/' do
305 nokogiri :index
306 end
307
308 Renderiza <tt>./views/index.nokogiri</tt>.
309
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
310 === Plantillas Sass
311
d663ea1 @gnandretta spanish readme formatting adjustments
gnandretta authored
312 La gem/librería <tt>haml</tt> o <tt>sass</tt> es necesaria para renderizar
313 plantillas Sass:
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
314
314a98f @rkh Remove uneccessary # from READMEs.
rkh authored
315 # Vas a necesitar requerir haml o sass en tu app
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
316 require 'sass'
317
318 get '/stylesheet.css' do
319 sass :stylesheet
320 end
321
322 Renderiza <tt>./views/stylesheet.sass</tt>.
323
324 Las {opciones de Sass}[http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#options]
325 pueden ser ajustadas globalmente a través de las configuraciones de Sinatra,
326 ver {Opciones y Configuraciones}[http://www.sinatrarb.com/configuration.html],
327 y reemplazadas individualmente.
328
3a25d98 @rkh Adjust examples in French and Spanish READMEs.
rkh authored
329 set :sass, :style => :compact # el estilo por defecto de Sass es :nested
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
330
331 get '/stylesheet.css' do
332 sass :stylesheet, :style => :expanded # reemplazado
333 end
334
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
335 === Plantillas Scss
336
d663ea1 @gnandretta spanish readme formatting adjustments
gnandretta authored
337 La gem/librería <tt>haml</tt> o <tt>sass</tt>es necesaria para renderizar
338 plantillas Scss:
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
339
314a98f @rkh Remove uneccessary # from READMEs.
rkh authored
340 # Vas a necesitar requerir haml o sass en tu app
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
341 require 'sass'
342
343 get '/stylesheet.css' do
344 scss :stylesheet
345 end
346
347 Renderiza <tt>./views/stylesheet.scss</tt>.
348
349 Las {opciones de Scss}[http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#options]
350 pueden ser ajustadas globalmente a través de las configuraciones de Sinatra,
351 ver {Opciones y Configuraciones}[http://www.sinatrarb.com/configuration.html],
352 y reemplazadas individualmente.
353
354 set :scss, :style => :compact # el estilo por defecto de Sass es :nested
355
356 get '/stylesheet.css' do
357 scss :stylesheet, :style => :expanded # reemplazado
358 end
359
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
360 === Plantillas Less
361
d663ea1 @gnandretta spanish readme formatting adjustments
gnandretta authored
362 La gem/librería <tt>less</tt> es necesaria para renderizar plantillas Less:
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
363
314a98f @rkh Remove uneccessary # from READMEs.
rkh authored
364 # Vas a necesitar requerir less en tu app
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
365 require 'less'
366
367 get '/stylesheet.css' do
368 less :stylesheet
369 end
370
371 Renderiza <tt>./views/stylesheet.less</tt>.
372
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
373 === Plantillas Liquid
374
d663ea1 @gnandretta spanish readme formatting adjustments
gnandretta authored
375 La gem/librería <tt>liquid</tt> es necesaria para renderizar plantillas Liquid:
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
376
314a98f @rkh Remove uneccessary # from READMEs.
rkh authored
377 # Vas a necesitar requerir liquid en tu app
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
378 require 'liquid'
379
380 get '/' do
381 liquid :index
382 end
383
384 Renderiza <tt>./views/index.liquid</tt>.
385
386 Como no vas a poder llamar a métodos de Ruby (excepto a +yield+) desde una
387 plantilla Liquid, casi siempre vas a querer pasarle locales:
388
389 liquid :index, :locals => { :clave => 'valor' }
390
391 === Plantillas Markdown
392
d663ea1 @gnandretta spanish readme formatting adjustments
gnandretta authored
393 La gem/librería <tt>rdiscount</tt> es necesaria para renderizar plantillas
394 Markdown:
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
395
314a98f @rkh Remove uneccessary # from READMEs.
rkh authored
396 # Vas a necesitar requerir rdiscount en tu app
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
397 require "rdiscount"
398
399 get '/' do
400 markdown :index
401 end
402
403 Renderiza <tt>./views/index.markdown</tt> (+md+ y +mkd+ también son extensiones
404 de archivo válidas).
405
406 No es posible llamar métodos desde markdown, ni pasarle locales. Por lo tanto,
407 generalmente vas a usarlo en combinación con otro motor de renderizado:
408
409 erb :resumen, :locals => { :texto => markdown(:introduccion) }
410
5a17ea0 @gnandretta add BlueCloth example to spanish readme
gnandretta authored
411 Tené en cuenta que también podés llamar al método +markdown+ desde otras
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
412 plantillas:
413
414 %h1 Hola Desde Haml!
415 %p= markdown(:saludos)
416
7fef872 @gnandretta explain how to use :layout_engine in spanish readme
gnandretta authored
417 Como no podés utilizar Ruby desde Markdown, no podés usar layouts escritos en
418 Markdown. De todos modos, es posible usar un motor de renderizado para el
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
419 layout distinto al de la plantilla pasando la opción <tt>:layout_engine</tt>:
7fef872 @gnandretta explain how to use :layout_engine in spanish readme
gnandretta authored
420
421 get '/' do
422 markdown :index, :layout_engine => :erb
423 end
424
425 Renderiza <tt>./views/index.md</tt> con el layout <tt>./views/layout.erb</tt>.
426
427 Recordá que podés asignar las opciones de renderizado globalmente:
428
429 set :markdown, :layout_engine => :haml, :layout => :post
430
431 get '/' do
432 markdown :index
433 end
434
435 Renderiza <tt>./views/index.md</tt> (o cualquier otra plantilla Markdown) con
436 el layout <tt>./views/post.haml</tt>.
437
5a17ea0 @gnandretta add BlueCloth example to spanish readme
gnandretta authored
438 También es posible parsear Markdown con BlueCloth en lugar de RDiscount:
439
440 require 'bluecloth'
441
442 Tilt.register 'markdown', BlueClothTemplate
443 Tilt.register 'mkd', BlueClothTemplate
444 Tilt.register 'md', BlueClothTemplate
445
446 get '/' do
447 markdown :index
448 end
449
450 Renderiza <tt>./views/index.md</tt> con BlueCloth.
451
9e613d2 @gnandretta fix typo in spanish readme
gnandretta authored
452 === Plantillas Textile
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
453
d663ea1 @gnandretta spanish readme formatting adjustments
gnandretta authored
454 La gem/librería <tt>RedCloth</tt> es necesaria para renderizar plantillas
455 Textile:
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
456
314a98f @rkh Remove uneccessary # from READMEs.
rkh authored
457 # Vas a necesitar requerir redcloth en tu app
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
458 require "redcloth"
459
460 get '/' do
461 textile :index
462 end
463
464 Renderiza <tt>./views/index.textile</tt>.
465
466 No es posible llamar métodos desde textile, ni pasarle locales. Por lo tanto,
467 generalmente vas a usarlo en combinación con otro motor de renderizado:
468
469 erb :resumen, :locals => { :texto => textile(:introduccion) }
470
d663ea1 @gnandretta spanish readme formatting adjustments
gnandretta authored
471 Tené en cuenta que también podés llamar al método +textile+ desde otras
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
472 plantillas:
473
474 %h1 Hola Desde Haml!
475 %p= textile(:saludos)
476
7fef872 @gnandretta explain how to use :layout_engine in spanish readme
gnandretta authored
477 Como no podés utilizar Ruby desde Textile, no podés usar layouts escritos en
478 Textile. De todos modos, es posible usar un motor de renderizado para el
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
479 layout distinto al de la plantilla pasando la opción <tt>:layout_engine</tt>:
7fef872 @gnandretta explain how to use :layout_engine in spanish readme
gnandretta authored
480
481 get '/' do
482 textile :index, :layout_engine => :erb
483 end
484
485 Renderiza <tt>./views/index.textile</tt> con el layout
486 <tt>./views/layout.erb</tt>.
487
488 Recordá que podés asignar las opciones de renderizado globalmente:
489
490 set :textile, :layout_engine => :haml, :layout => :post
491
492 get '/' do
493 textile :index
494 end
495
496 Renderiza <tt>./views/index.textile</tt> (o cualquier otra plantilla Textile)
497 con el layout <tt>./views/post.haml</tt>.
498
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
499 === Plantillas RDoc
500
d663ea1 @gnandretta spanish readme formatting adjustments
gnandretta authored
501 La gem/librería <tt>rdoc</tt> es necesaria para renderizar plantillas RDoc:
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
502
7c186a0 @rkh require "rdoc" -> require "rdoc/markup/to_html"
rkh authored
503 # Vas a necesitar requerir rdoc/markup/to_html en tu app
504 require "rdoc/markup/to_html"
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
505
506 get '/' do
507 rdoc :index
508 end
509
510 Renderiza <tt>./views/index.rdoc</tt>.
511
512 No es posible llamar métodos desde rdoc, ni pasarle locales. Por lo tanto,
513 generalmente vas a usarlo en combinación con otro motor de renderizado:
514
515 erb :resumen, :locals => { :texto => rdoc(:introduccion) }
516
d663ea1 @gnandretta spanish readme formatting adjustments
gnandretta authored
517 Tené en cuenta que también podés llamar al método +rdoc+ desde otras
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
518 plantillas:
519
520 %h1 Hola Desde Haml!
521 %p= rdoc(:saludos)
522
7fef872 @gnandretta explain how to use :layout_engine in spanish readme
gnandretta authored
523 Como no podés utilizar Ruby desde RDoc, no podés usar layouts escritos en RDoc.
524 De todos modos, es posible usar un motor de renderizado para el layout distinto
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
525 al de la plantilla pasando la opción <tt>:layout_engine</tt>:
7fef872 @gnandretta explain how to use :layout_engine in spanish readme
gnandretta authored
526
527 get '/' do
528 rdoc :index, :layout_engine => :erb
529 end
530
531 Renderiza <tt>./views/index.rdoc</tt> con el layout <tt>./views/layout.erb</tt>.
532
533 Recordá que podés asignar las opciones de renderizado globalmente:
534
535 set :rdoc, :layout_engine => :haml, :layout => :post
536
537 get '/' do
538 rdoc :index
539 end
540
541 Renderiza <tt>./views/index.rdoc</tt> (o cualquier otra plantilla RDoc) con el
542 layout <tt>./views/post.haml</tt>.
543
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
544 === Plantillas Radius
545
d663ea1 @gnandretta spanish readme formatting adjustments
gnandretta authored
546 La gem/librería <tt>radius</tt> es necesaria para renderizar plantillas Radius:
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
547
314a98f @rkh Remove uneccessary # from READMEs.
rkh authored
548 # Vas a necesitar requerir radius en tu app
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
549 require 'radius'
550
551 get '/' do
552 radius :index
553 end
554
555 Renderiza <tt>./views/index.radius</tt>.
556
557 Como no vas a poder llamar a métodos de Ruby (excepto a +yield+) desde una
558 plantilla Radius, casi siempre vas a querer pasarle locales:
559
560 radius :index, :locals => { :clave => 'valor' }
561
562 === Plantillas Markaby
563
d663ea1 @gnandretta spanish readme formatting adjustments
gnandretta authored
564 La gem/librería <tt>markaby</tt> es necesaria para renderizar plantillas
565 Markaby:
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
566
314a98f @rkh Remove uneccessary # from READMEs.
rkh authored
567 # Vas a necesitar requerir markaby en tu app
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
568 require 'markaby'
569
570 get '/' do
571 markaby :index
572 end
573
574 Renderiza <tt>./views/index.mab</tt>.
575
7c95249 @gnandretta update how to use inline Markaby in spanish readme
gnandretta authored
576 También podés usar Markaby inline:
78bb1d9 @gnandretta update REAMDE.es.rdoc
gnandretta authored
577
578 get '/' do
579 markaby { h1 "Bienvenido!" }
580 end
581
582
ca7fbe5 @rkh Add documentation for Slim templates.
rkh authored
583 === Plantillas Slim
584
3cd76a3 @gnandretta spanish readme formatting (not valid for 1.1.x)
gnandretta authored
585 La gem/librería <tt>slim</tt> es necesaria para renderizar plantillas Slim:
ca7fbe5 @rkh Add documentation for Slim templates.
rkh authored
586
314a98f @rkh Remove uneccessary # from READMEs.
rkh authored
587 # Vas a necesitar requerir slim en tu app
ca7fbe5 @rkh Add documentation for Slim templates.
rkh authored
588 require 'slim'
589
590 get '/' do
591 slim :index
592 end
593
594 Renderiza <tt>./views/index.slim</tt>.
595
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
596 === Plantillas CoffeeScript
597
425c275 @gnandretta update CoffeeScript section with requirements for ruby-coffeescript 2…
gnandretta authored
598 La gem/librería <tt>coffee-script</tt> y al menos <b>una</b> de las siguientes
599 opciones para ejecutar JavaScript:
600
601 * +node+ (de Node.js) en tu path
602 * utilizar OSX
603 * la gem/librería +therubyracer+
604
605 son necesarios para renderizar plantillas CoffeeScript:
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
606
314a98f @rkh Remove uneccessary # from READMEs.
rkh authored
607 # Vas a necesitar requerir coffee-script en tu app
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
608 require 'coffee-script'
609
610 get '/application.js' do
611 coffee :application
612 end
613
614 Renderiza <tt>./views/application.coffee</tt>.
615
5d5d5bb @gnandretta rename one of the two 'Plantillas Inline' to 'Plantillas Embebidas' i…
gnandretta authored
616 === Plantillas Embebidas
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
617
618 get '/' do
619 haml '%div.titulo Hola Mundo'
620 end
621
5d5d5bb @gnandretta rename one of the two 'Plantillas Inline' to 'Plantillas Embebidas' i…
gnandretta authored
622 Renderiza el template embebido en el string.
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
623
624 === Accediendo a Variables en Plantillas
625
626 Las plantillas son evaluadas dentro del mismo contexto que los manejadores de
52d4311 @gnandretta improves Spanish README
gnandretta authored
627 ruta. Las variables de instancia asignadas en los manejadores de ruta son
628 accesibles directamente por las plantillas:
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
629
630 get '/:id' do
631 @foo = Foo.find(params[:id])
632 haml '%h1= @foo.nombre'
633 end
634
52d4311 @gnandretta improves Spanish README
gnandretta authored
635 O es posible especificar un Hash de variables locales explícitamente:
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
636
637 get '/:id' do
638 foo = Foo.find(params[:id])
639 haml '%h1= foo.nombre', :locals => { :foo => foo }
640 end
641
642 Esto es usado típicamente cuando se renderizan plantillas como parciales desde
643 adentro de otras plantillas.
644
645 === Plantillas Inline
646
647 Las plantillas pueden ser definidas al final del archivo fuente:
648
649 require 'rubygems'
650 require 'sinatra'
651
652 get '/' do
653 haml :index
654 end
655
656 __END__
657
658 @@ layout
659 %html
660 = yield
661
662 @@ index
663 %div.titulo Hola mundo!!!!!
664
665 NOTA: únicamente las plantillas inline definidas en el archivo fuente que
6584711 @rkh Minor markup fix in README.
rkh authored
666 requiere sinatra son cargadas automáticamente. Llamá <tt>enable
667 :inline_templates</tt> explícitamente si tenés plantillas inline en otros
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
668 archivos fuente.
669
670 === Plantillas Nombradas
671
672 Las plantillas también pueden ser definidas usando el método top-level
673 <tt>template</tt>:
674
675 template :layout do
676 "%html\n =yield\n"
677 end
678
679 template :index do
680 '%div.titulo Hola Mundo!'
681 end
682
683 get '/' do
684 haml :index
685 end
686
687 Si existe una plantilla con el nombre "layout", va a ser usada cada vez que
361ed82 @gnandretta update the layout options in the spanish readme
gnandretta authored
688 una plantilla es renderizada. Podés desactivar los layouts individualmente
689 pasando <tt>:layout => false</tt> o globalmente con
79032f7 @gnandretta sync spanish readme, fixes #204
gnandretta authored
690 <tt>set :haml, :layout => false</tt>:
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
691
692 get '/' do
693 haml :index, :layout => !request.xhr?
694 end
695
e85b097 @gnandretta add 'Asociando Extensiones de Archivo' section to spanish readme
gnandretta authored
696 === Asociando Extensiones de Archivo
697
698 Para asociar una extensión de archivo con un motor de renderizado, usá
699 <tt>Tilt.register</tt>. Por ejemplo, si querés usar la extensión +tt+ para
a28ed50 @rkh Fix typo in Spanish README.
rkh authored
700 las plantillas Textile, podés hacer lo siguiente:
e85b097 @gnandretta add 'Asociando Extensiones de Archivo' section to spanish readme
gnandretta authored
701
702 Tilt.register :tt, Tilt[:textile]
703
56bb2fc @gnandretta add 'Agregando Tu Propio Motor de Renderizado' section to spanish readme
gnandretta authored
704 === Agregando Tu Propio Motor de Renderizado
705
706 Primero, registrá tu motor con Tilt, y después, creá tu método de renderizado:
707
708 Tilt.register :mipg, MiMotorParaPlantillaGenial
709
710 helpers do
711 def mypg(*args) render(:mypg, *args) end
712 end
713
714 get '/' do
715 mypg :index
716 end
717
718 Renderiza <tt>./views/index.mypg</tt>. Mirá https://github.com/rtomayko/tilt
719 para aprender más de Tilt.
720
52d4311 @gnandretta improves Spanish README
gnandretta authored
721 == Filtros
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
722
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
723 Los filtros +before+ son evaluados antes de cada petición dentro del mismo
724 contexto que las rutas. Pueden modificar la petición y la respuesta. Las
725 variables de instancia asignadas en los filtros son accesibles por las rutas y
726 las plantillas:
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
727
728 before do
729 @nota = 'Hey!'
730 request.path_info = '/foo/bar/baz'
731 end
732
733 get '/foo/*' do
734 @nota #=> 'Hey!'
735 params[:splat] #=> 'bar/baz'
736 end
737
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
738 Los filtros +after+ son evaluados después de cada petición dentro del mismo
739 contexto y también pueden modificar la petición y la respuesta. Las variables
740 de instancia asignadas en los filtros +before+ y en las rutas son accesibles por
741 los filtros +after+:
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
742
743 after do
744 puts response.status
745 end
746
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
747 Nota: A menos que usés el método +body+ en lugar de simplemente devolver un
23044e5 @gnandretta document accessing response body in after filter in spanish readme
gnandretta authored
748 string desde una ruta, el cuerpo de la respuesta no va a estar disponible en
749 un filtro after, debido a que todavía no se ha generado.
750
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
751 Los filtros aceptan un patrón opcional, que cuando está presente causa que los
752 mismos sean evaluados únicamente si el path de la petición coincide con ese
753 patrón:
754
755 before '/protegido/*' do
756 autenticar!
757 end
758
759 after '/crear/:slug' do |slug|
760 session[:ultimo_slug] = slug
761 end
762
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
763 Al igual que las rutas, los filtros también pueden aceptar condiciones:
78bb1d9 @gnandretta update REAMDE.es.rdoc
gnandretta authored
764
765 before :agent => /Songbird/ do
766 # ...
767 end
768
769 after '/blog/*', :host_name => 'ejemplo.com' do
770 # ...
771 end
772
170cca2 @gnandretta reorganizing helpers in spanish readme
gnandretta authored
773 == Ayudantes
774
775 Usá el método top-level <tt>helpers</tt> para definir métodos ayudantes que
776 pueden ser utilizados dentro de los manejadores de rutas y las plantillas:
777
778 helpers do
779 def bar(nombre)
780 "#{nombre}bar"
781 end
782 end
783
784 get '/:nombre' do
785 bar(params[:nombre])
786 end
787
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
788 === Usando Sesiones
789
790 Una sesión es usada para mantener el estado a través de distintas peticiones.
791 Cuando están activadas, tenés un hash de sesión para cada sesión de usuario:
792
793 enable :sessions
794
795 get '/' do
796 "valor = " << session[:valor].inspect
797 end
798
799 get '/:valor' do
800 session[:valor] = params[:valor]
801 end
802
803 Tené en cuenta que <tt>enable :sessions</tt> guarda todos los datos en una
804 cookie, lo que no es siempre deseable (guardar muchos datos va a incrementar
805 tu tráfico, por citar un ejemplo). Podés usar cualquier middleware Rack para
806 manejar sesiones, de la misma manera que usarías cualquier otro middleware,
807 pero con la salvedad de que *no* tenés que llamar a <tt>enable :sessions</tt>:
808
809 use Rack::Session::Pool, :expire_after => 2592000
810
811 get '/' do
812 "valor = " << session[:valor].inspect
813 end
814
815 get '/:valor' do
816 session[:valor] = params[:valor]
817 end
818
6d7c4c0 @gnandretta document session_secret in spanish readme
gnandretta authored
819 Para incrementar la seguridad, los datos de la sesión almacenados en
820 la cookie son firmados con un secreto de sesión. Este secreto, es
821 generado aleatoriamente por Sinatra. De cualquier manera, hay que
822 tener en cuenta que cada vez que inicies la aplicación se va a generar
823 uno nuevo. Así, si querés que todas las instancias de tu aplicación
824 compartan un único secreto, tenés que definirlo vos:
825
826 set :session_secret, 'super secreto'
827
170cca2 @gnandretta reorganizing helpers in spanish readme
gnandretta authored
828 === Interrupción
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
829
830 Para detener inmediatamente una petición dentro de un filtro o una ruta usá:
831
832 halt
833
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
834 También podés especificar el estado:
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
835
836 halt 410
837
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
838 O el cuerpo:
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
839
840 halt 'esto va a ser el cuerpo'
841
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
842 O los dos:
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
843
844 halt 401, 'salí de acá!'
845
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
846 Con cabeceras:
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
847
848 halt 402, { 'Content-Type' => 'text/plain' }, 'venganza'
849
5ca1df7 @gnandretta add example for halt with template in spanish readme
gnandretta authored
850 Obviamente, es posible utilizar +halt+ con una plantilla:
851
852 halt erb(:error)
853
170cca2 @gnandretta reorganizing helpers in spanish readme
gnandretta authored
854 === Paso
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
855
856 Una ruta puede pasarle el procesamiento a la siguiente ruta que coincida con
857 la petición usando <tt>pass</tt>:
858
859 get '/adivina/:quien' do
860 pass unless params[:quien] == 'Franco'
861 'Adivinaste!'
862 end
863
864 get '/adivina/*' do
865 'Erraste!'
866 end
867
868 Se sale inmediatamente del bloque de la ruta y se le pasa el control a la
869 siguiente ruta que coincida. Si no coincide ninguna ruta, se devuelve un 404.
870
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
871 === Ejecutando Otra Ruta
872
873 Cuando querés obtener el resultado de la llamada a una ruta, +pass+ no te va a
874 servir. Para lograr esto, podés usar +call+:
875
876 get '/foo' do
a6659f4 @rkh env is accessable directly, no need to use request.env
rkh authored
877 status, headers, body = call env.merge("PATH_INFO" => '/bar')
8467547 @rkh test and fix #call example
rkh authored
878 [status, headers, body.map(&:upcase)]
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
879 end
880
881 get '/bar' do
882 "bar"
883 end
884
885 Notá que en el ejemplo anterior, es conveniente mover <tt>"bar"</tt> a un
886 helper, y llamarlo desde <tt>/foo</tt> y <tt>/bar</tt>. Así, vas a simplificar
887 las pruebas y a mejorar el rendimiento.
888
889 Si querés que la petición se envíe a la misma instancia de la aplicación en
890 lugar de a otra, usá <tt>call!</tt> en lugar de <tt>call</tt>.
891
892 En la especificación de Rack podés encontrar más información sobre
893 <tt>call</tt>.
894
895 === Asignando el Código de Estado, los Encabezados y el Cuerpo de una Respuesta
252a8d0 @gnandretta document body and status helper methods in spanish readme
gnandretta authored
896
897 Es posible, y se recomienda, asignar el código de estado y el cuerpo de una
898 respuesta con el valor de retorno de una ruta. De cualquier manera, en varios
899 escenarios, puede que sea conveniente asignar el cuerpo en un punto arbitrario
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
900 del flujo de ejecución con el método +body+. A partir de ahí, podés usar ese
252a8d0 @gnandretta document body and status helper methods in spanish readme
gnandretta authored
901 mismo método para acceder al cuerpo de la respuesta:
902
903 get '/foo' do
904 body "bar"
905 end
906
907 after do
908 puts body
909 end
910
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
911 También es posible pasarle un bloque a +body+, que será ejecutado por el Rack
912 handler (podés usar esto para implementar streaming, mirá "Valores de retorno").
252a8d0 @gnandretta document body and status helper methods in spanish readme
gnandretta authored
913
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
914 De manera similar, también podés asignar el código de estado y encabezados:
252a8d0 @gnandretta document body and status helper methods in spanish readme
gnandretta authored
915
916 get '/foo' do
917 status 418
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
918 headers \
696d895 @rkh fix teapot example
rkh authored
919 "Allow" => "BREW, POST, GET, PROPFIND, WHEN",
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
920 "Refresh" => "Refresh: 20; http://www.ietf.org/rfc/rfc2324.txt"
921 body "I'm a tea pot!"
922 end
923
924 También, al igual que +body+, tanto +status+ como +headers+ pueden utilizarse
925 para obtener sus valores cuando no se les pasa argumentos.
926
927 === Tipos Mime
928
929 Cuando usás <tt>send_file</tt> o archivos estáticos tal vez tengas tipos mime
930 que Sinatra no entiende. Usá +mime_type+ para registrarlos a través de la
931 extensión de archivo:
932
933 mime_type :foo, 'text/foo'
934
935 También lo podés usar con el ayudante +content_type+:
936
937 get '/' do
938 content_type :foo
939 "foo foo foo"
252a8d0 @gnandretta document body and status helper methods in spanish readme
gnandretta authored
940 end
941
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
942 === Generando URLs
943
944 Para generar URLs deberías usar el método +url+. Por ejemplo, en Haml:
945
946 %a{:href => url('/foo')} foo
947
948 Tiene en cuenta proxies inversos y encaminadores de Rack, si están presentes.
949
950 Este método también puede invocarse mediante su alias +to+ (mirá un ejemplo
951 a continuación).
952
5a22939 @gnandretta document redirect in spanish readme
gnandretta authored
953 === Redirección del Navegador
954
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
955 Podés redireccionar al navegador con el método +redirect+:
5a22939 @gnandretta document redirect in spanish readme
gnandretta authored
956
957 get '/foo' do
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
958 redirect to('/bar')
5a22939 @gnandretta document redirect in spanish readme
gnandretta authored
959 end
960
961 Cualquier parámetro adicional se utiliza de la misma manera que los argumentos
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
962 pasados a +halt+:
963
964 redirect to('/bar'), 303
965 redirect 'http://google.com', 'te confundiste de lugar, compañero'
5a22939 @gnandretta document redirect in spanish readme
gnandretta authored
966
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
967 También podés redireccionar fácilmente de vuelta hacia la página desde donde
968 vino el usuario con +redirect back+:
5a22939 @gnandretta document redirect in spanish readme
gnandretta authored
969
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
970 get '/foo' do
971 "<a href='/bar'>hacer algo</a>"
972 end
973
974 get '/bar' do
975 hacer_algo
976 redirect back
977 end
978
979 Para pasar argumentos con una redirección, podés agregarlos a la cadena de
5a22939 @gnandretta document redirect in spanish readme
gnandretta authored
980 búsqueda:
981
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
982 redirect to('/bar?suma=42')
5a22939 @gnandretta document redirect in spanish readme
gnandretta authored
983
984 O usar una sesión:
985
8197e2c @Igneous fix readme: enable :session => enable :sessions
Igneous authored
986 enable :sessions
5a22939 @gnandretta document redirect in spanish readme
gnandretta authored
987
988 get '/foo' do
989 session[:secreto] = 'foo'
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
990 redirect to('/bar')
5a22939 @gnandretta document redirect in spanish readme
gnandretta authored
991 end
992
993 get '/bar' do
994 session[:secreto]
995 end
996
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
997 === Cache Control
998
999 Asignar tus encabezados correctamente es el cimiento para realizar un cacheo
1000 HTTP correcto.
1001
1002 Podés asignar el encabezado Cache-Control fácilmente:
1003
1004 get '/' do
1005 cache_control :public
1006 "cachealo!"
1007 end
1008
79032f7 @gnandretta sync spanish readme, fixes #204
gnandretta authored
1009 Pro tip: configurar el cacheo en un filtro +before+:
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
1010
1011 before do
1012 cache_control :public, :must_revalidate, :max_age => 60
1013 end
1014
1015 Si estás usando el helper +expires+ para definir el encabezado correspondiente,
1016 <tt>Cache-Control</tt> se va a definir automáticamente:
1017
1018 before do
1019 expires 500, :public, :must_revalidate
1020 end
1021
1022 Para usar cachés adecuadamente, deberías considerar usar +etag+ y
1023 +last_modified+. Es recomendable que llames a estos helpers *antes* de hacer
1024 cualquier trabajo pesado, ya que van a enviar la respuesta inmediatamente si
79032f7 @gnandretta sync spanish readme, fixes #204
gnandretta authored
1025 el cliente ya tiene la versión actual en su caché:
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
1026
1027 get '/articulo/:id' do
1028 @articulo = Articulo.find params[:id]
1029 last_modified @articulo.updated_at
1030 etag @articulo.sha1
1031 erb :articulo
1032 end
1033
1034 También es posible usar una
1035 {weak ETag}[http://en.wikipedia.org/wiki/HTTP_ETag#Strong_and_weak_validation]:
1036
1037 etag @articulo.sha1, :weak
1038
1039 Estos helpers no van a cachear nada por vos, sino que van a facilitar la
1040 información necesaria para poder hacerlo. Si estás buscando soluciones rápidas
1041 de cacheo, mirá {rack-cache}[http://rtomayko.github.com/rack-cache/]:
1042
1043 require "rack/cache"
1044 require "sinatra"
1045
1046 use Rack::Cache
1047
1048 get '/' do
1049 cache_control :public, :max_age => 36000
1050 sleep 5
1051 "hola"
1052 end
1053
1054 === Enviando Archivos
1055
1056 Para enviar archivos, podés usar el método <tt>send_file</tt>:
1057
1058 get '/' do
1059 send_file 'foo.png'
1060 end
1061
1062 Además acepta un par de opciones:
1063
1064 send_file 'foo.png', :type => :jpg
1065
1066 Estas opciones son:
1067
1068 [filename]
1069 nombre del archivo respondido, por defecto es el nombre real del archivo.
1070
1071 [last_modified]
1072 valor para el encabezado Last-Modified, por defecto toma el mtime del archivo.
1073
1074 [type]
1075 el content type que se va a utilizar, si no está presente se intenta adivinar
1076 a partir de la extensión del archivo.
1077
1078 [disposition]
1079 se utiliza para el encabezado Content-Disposition, y puede tomar alguno de los
1080 siguientes valores: +nil+ (por defecto), <tt>:attachment</tt> e
1081 <tt>:inline</tt>
1082
1083 [length]
1084 encabezado Content-Length, por defecto toma el tamaño del archivo.
1085
1086 Si el Rack handler lo soporta, se intentará no transmitir directamente desde el
1087 proceso de Ruby. Si usás este método, Sinatra se va a encargar automáticamente
1088 peticiones de rango.
1089
170cca2 @gnandretta reorganizing helpers in spanish readme
gnandretta authored
1090 === Accediendo al objeto de la petición
450c3c4 @gnandretta syncs up the README's spanish translation
gnandretta authored
1091
1092 El objeto de la petición entrante puede ser accedido desde el nivel de la
1093 petición (filtros, rutas y manejadores de errores) a través del método
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
1094 <tt>request</tt>:
450c3c4 @gnandretta syncs up the README's spanish translation
gnandretta authored
1095
1096 # app corriendo en http://ejemplo.com/ejemplo
1097 get '/foo' do
1098 request.body # cuerpo de la petición enviado por el cliente (ver más abajo)
1099 request.scheme # "http"
1100 request.script_name # "/ejemplo"
1101 request.path_info # "/foo"
1102 request.port # 80
1103 request.request_method # "GET"
1104 request.query_string # ""
1105 request.content_length # longitud de request.body
1106 request.media_type # tipo de medio de request.body
1107 request.host # "ejemplo.com"
1108 request.get? # verdadero (hay métodos análogos para los otros verbos)
1109 request.form_data? # falso
1110 request["UNA_CABECERA"] # valor de la cabecera UNA_CABECERA
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
1111 request.referrer # la referencia del cliente o '/'
450c3c4 @gnandretta syncs up the README's spanish translation
gnandretta authored
1112 request.user_agent # user agent (usado por la condición :agent)
1113 request.cookies # hash de las cookies del browser
1114 request.xhr? # es una petición ajax?
1115 request.url # "http://ejemplo.com/ejemplo/foo"
1116 request.path # "/ejemplo/foo"
1117 request.ip # dirección IP del cliente
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
1118 request.secure? # falso (sería verdadero sobre ssl)
1119 request.forwarded? # verdadero (si se está corriendo atrás de un proxy inverso)
450c3c4 @gnandretta syncs up the README's spanish translation
gnandretta authored
1120 requuest.env # hash de entorno directamente entregado por Rack
1121 end
1122
1123 Algunas opciones, como <tt>script_name</tt> o <tt>path_info</tt> pueden
1124 también ser escritas:
1125
1126 before { request.path_info = "/" }
1127
1128 get "/" do
1129 "todas las peticiones llegan acá"
1130 end
1131
1132 El objeto <tt>request.body</tt> es una instancia de IO o StringIO:
1133
1134 post "/api" do
1135 request.body.rewind # en caso de que alguien ya lo haya leído
1136 datos = JSON.parse request.body.read
1137 "Hola #{datos['nombre']}!"
1138 end
1139
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
1140 === Archivos Adjuntos
1141
1142 Podés usar el método helper +attachment+ para indicarle al navegador que
79032f7 @gnandretta sync spanish readme, fixes #204
gnandretta authored
1143 almacene la respuesta en el disco en lugar de mostrarla en pantalla:
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
1144
1145 get '/' do
1146 attachment
1147 "guardalo!"
1148 end
1149
1150 También podés pasarle un nombre de archivo:
1151
1152 get '/' do
1153 attachment "info.txt"
1154 "guardalo!"
1155 end
1156
1157 === Buscando los Archivos de las Plantillas
1158
1159 El helper <tt>find_template</tt> se utiliza para encontrar los archivos de las
1160 plantillas que se van a renderizar:
1161
1162 find_template settings.views, 'foo', Tilt[:haml] do |archivo|
1163 puts "podría ser #{archivo}"
1164 end
1165
1166 Si bien esto no es muy útil, lo interesante es que podés sobreescribir este
1167 método, y así enganchar tu propio mecanismo de búsqueda. Por ejemplo, para
1168 poder utilizar más de un directorio de vistas:
1169
1170 set :views, ['vistas', 'plantillas']
1171
1172 helpers do
1173 def find_template(views, name, engine, &block)
1174 Array(views).each { |v| super(v, name, engine, &block) }
1175 end
1176 end
1177
1178 Otro ejemplo consiste en usar directorios diferentes para los distintos motores
1179 de renderizado:
1180
1181 set :views, :sass => 'vistas/sass', :haml => 'plantillas', :defecto => 'vistas'
1182
1183 helpers do
1184 def find_template(views, name, engine, &block)
1185 _, folder = views.detect { |k,v| engine == Tilt[k] }
1186 folder ||= views[:defecto]
1187 super(folder, name, engine, &block)
1188 end
1189 end
1190
1191 ¡Es muy fácil convertir estos ejemplos en una extensión y compartirla!.
1192
1193 Notá que <tt>find_template</tt> no verifica si un archivo existe realmente, sino
1194 que llama al bloque que recibe para cada path posible. Esto no representa un
1195 problema de rendimiento debido a que +render+ va a usar +break+ ni bien
1196 encuentre un archivo que exista. Además, las ubicaciones de las plantillas (y
1197 su contenido) se cachean cuando no estás en el modo de desarrollo. Es bueno
1198 tener en cuenta lo anteiror si escribís un método medio loco.
1199
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
1200 == Configuración
1201
1202 Ejecutar una vez, en el inicio, en cualquier entorno:
1203
1204 configure do
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
1205 # asignando una opción
1206 set :opcion, 'valor'
1207
1208 # asignando varias opciones
1209 set :a => 1, :b => 2
1210
1211 # atajo para `set :opcion, true`
1212 enable :opcion
1213
1214 # atajo para `set :opcion, false`
1215 disable :opcion
1216
1217 # también podés tener configuraciones dinámicas usando bloques
1218 set(:css_dir) { File.join(views, 'css') }
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
1219 end
1220
1221 Ejecutar únicamente cuando el entorno (la variable de entorno RACK_ENV) es
1222 <tt>:production</tt>:
1223
1224 configure :production do
1225 ...
1226 end
1227
1228 Ejecutar cuando el entorno es <tt>:production</tt> o <tt>:test</tt>:
1229
1230 configure :production, :test do
1231 ...
1232 end
1233
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
1234 Podés acceder a estas opciones utilizando el método <tt>settings</tt>:
1235
1236 configure do
1237 set :foo, 'bar'
1238 end
1239
1240 get '/' do
1241 settings.foo? # => true
1242 settings.foo # => 'bar'
1243 ...
1244 end
1245
1246 === Configuraciones Disponibles
1247
1248 [absolute_redirects] si está deshabilitada, Sinatra va a permitir redirecciones
1249 relativas, sin embargo, como consecuencia de esto, va a
1250 dejar de cumplir con el RFC 2616 (HTTP 1.1), que solamente
1251 permite redirecciones absolutas.
1252
1253 Activalo si tu apliación está corriendo atrás de un proxy
1254 inverso que no se ha configurado adecuadamente. Notá que
1255 el helper +url+ va a seguir produciendo URLs absolutas, a
1256 menos que le pasés +false+ como segundo parámetro.
1257
1258 Deshabilitada por defecto.
1259
1260 [add_charsets] tipos mime a los que el helper <tt>content_type</tt> les
1261 añade automáticamente el charset.
1262
1263 En general, no deberías asignar directamente esta opción,
1264 sino añadirle los charsets que quieras:
1265
1266 settings.add_charsets << "application/foobar"
1267
1268 [app_file] archivo principal de la aplicación, se utiliza para
1269 detectar la raíz del proyecto, el directorio de las vistas
1270 y el público así como las plantillas inline.
1271
1272 [bind] dirección IP que utilizará el servidor integrado (por
1273 defecto: 0.0.0.0).
1274
1275 [default_encoding] encoding utilizado cuando el mismo se desconoce (por
1276 defecto <tt>"utf-8"</tt>).
1277
1278 [dump_errors] mostrar errores en el log.
1279
1280 [environment] entorno actual, por defecto toma el valor de
1281 <tt>ENV['RACK_ENV']</tt>, o <tt>"development"</tt> si no
1282 está disponible.
1283
1284 [logging] define si se utiliza el logger.
1285
1286 [lock] coloca un lock alrededor de cada petición, procesando
1287 solamente una por proceso.
1288
1289 Habilitá esta opción si tu aplicación no es thread-safe.
1290 Se encuentra deshabilitada por defecto.
1291
1292 [method_override] utiliza el parámetro <tt>_method</tt> para permtir
1293 formularios put/delete en navegadores que no los soportan.
1294
1295 [port] puerto en el que escuchará el servidor integrado.
1296
1297 [prefixed_redirects] define si inserta <tt>request.script_name</tt> en las
1298 redirecciones cuando no se proporciona un path absoluto.
1299 De esta manera, cuando está habilitada,
1300 <tt>redirect '/foo'</tt> se comporta de la misma manera
1301 que <tt>redirect to('/foo')</tt>. Se encuentra
1302 deshabilitada por defecto.
1303
1304 [public] directorio desde donde se sirven los archivos públicos.
1305
1306 [reload_templates] define si se recargan las plantillas entre peticiones.
1307
1308 Se encuentra activado en el entorno de desarrollo y en
1309 Ruby 1.8.6 (para compoensar un bug en Ruby que provoca una
1310 pérdida de memoria).
1311
1312 [root] directorio raíz del proyecto.
1313
1314 [raise_errors] elevar excepciones (detiene la aplicación).
1315
1316 [run] cuando está habilitada, Sinatra se va a encargar de
1317 iniciar el servidor web, no la habilités cuando estés
1318 usando rackup o algún otro medio.
1319
1320 [running] indica si el servidor integrado está ejecutandose, ¡no
1321 cambiés esta configuración!.
1322
1323 [server] servidor, o lista de servidores, para usar como servidor
1324 integrado. Por defecto: ['thin', 'mongrel', 'webrick'],
1325 el orden establece la prioridad.
1326
1327 [sessions] habilita sesiones basadas en cookies.
1328
1329 [show_exceptions] muestra un stack trace en el navegador.
1330
1331 [static] define si Sinatra debe encargarse de servir archivos
1332 estáticos.
1333
5c66553 @gnandretta document static default value in spanish readme
gnandretta authored
1334 Deshabilitala cuando usés un servidor capaz de
1335 hacerlo por sí solo, porque mejorará el
1336 rendimiento. Se encuentra habilitada por
1337 defecto en el estilo clásico y desactivado en el
1338 el modular.
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
1339
1340 [views] directorio de las vistas.
1341
54384ec @gnandretta use same capitalization for all headings in spanish readme
gnandretta authored
1342 == Manejo de Errores
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
1343
1344 Los manejadores de errores se ejecutan dentro del mismo contexto que las rutas
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
1345 y los filtros +before+, lo que significa que podés usar, por ejemplo,
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
1346 <tt>haml</tt>, <tt>erb</tt>, <tt>halt</tt>, etc.
1347
1348 === No encontrado <em>(Not Found)</em>
1349
1350 Cuando se eleva una excepción <tt>Sinatra::NotFound</tt>, o el código de
1351 estado de la respuesta es 404, el manejador <tt>not_found</tt> es invocado:
1352
1353 not_found do
1354 'No existo'
1355 end
1356
1357 === Error
1358
1359 El manejador +error+ es invocado cada vez que una excepción es elevada
1360 desde un bloque de ruta o un filtro. El objeto de la excepción se puede
1361 obtener de la variable Rack <tt>sinatra.error</tt>:
1362
1363 error do
1364 'Disculpá, ocurrió un error horrible - ' + env['sinatra.error'].name
1365 end
1366
1367 Errores personalizados:
1368
1369 error MiErrorPersonalizado do
a6659f4 @rkh env is accessable directly, no need to use request.env
rkh authored
1370 'Lo que pasó fue...' + env['sinatra.error'].message
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
1371 end
1372
1373 Entonces, si pasa esto:
1374
1375 get '/' do
1376 raise MiErrorPersonalizado, 'algo malo'
1377 end
1378
1379 Obtenés esto:
1380
1381 Lo que pasó fue... algo malo
1382
1383 También, podés instalar un manejador de errores para un código de estado:
1384
1385 error 403 do
1386 'Acceso prohibido'
1387 end
1388
1389 get '/secreto' do
1390 403
1391 end
1392
1393 O un rango:
1394
1395 error 400..510 do
1396 'Boom'
1397 end
1398
1399 Sinatra instala manejadores <tt>not_found</tt> y <tt>error</ttt> especiales
1400 cuando se ejecuta dentro del entorno de desarrollo "development".
1401
1402 == Rack Middleware
1403
1404 Sinatra corre sobre Rack[http://rack.rubyforge.org/], una interfaz minimalista
1405 que es un estándar para frameworks webs escritos en Ruby. Una de las
1406 capacidades más interesantes de Rack para los desarrolladores de aplicaciones
1407 es el soporte de "middleware" -- componentes que se ubican entre el servidor y
1408 tu aplicación, supervisando y/o manipulando la petición/respuesta HTTP para
1409 proporcionar varios tipos de funcionalidades comunes.
1410
1411 Sinatra hace muy sencillo construir tuberías de Rack middleware a través del
1412 método top-level +use+:
1413
1414 require 'sinatra'
1415 require 'mi_middleware_personalizado'
1416
1417 use Rack::Lint
1418 use MiMiddlewarePersonalizado
1419
1420 get '/hola' do
1421 'Hola Mundo'
1422 end
1423
1424 Las semánticas de +use+ son idénticas a las definidas para el DSL
52d4311 @gnandretta improves Spanish README
gnandretta authored
1425 Rack::Builder[http://rack.rubyforge.org/doc/classes/Rack/Builder.html] (más
1426 frecuentemente usado desde archivos rackup). Por ejemplo, el método +use+
1427 acepta argumentos múltiples/variables así como bloques:
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
1428
1429 use Rack::Auth::Basic do |nombre_de_usuario, password|
1430 nombre_de_usuario == 'admin' && password == 'secreto'
1431 end
1432
1433 Rack es distribuido con una variedad de middleware estándar para logging,
1434 debugging, enrutamiento URL, autenticación, y manejo de sesiones. Sinatra
1435 usa muchos de estos componentes automáticamente de acuerdo a su configuración
1436 para que típicamente no tengas que usarlas (con +use+) explícitamente.
1437
52d4311 @gnandretta improves Spanish README
gnandretta authored
1438 == Pruebas
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
1439
52d4311 @gnandretta improves Spanish README
gnandretta authored
1440 Las pruebas para las aplicaciones Sinatra pueden ser escritas utilizando
1441 cualquier framework o librería de pruebas basada en Rack. Se recomienda usar
1442 {Rack::Test}[http://gitrdoc.com/brynary/rack-test]:
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
1443
1444 require 'mi_app_sinatra'
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
1445 require 'test/unit'
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
1446 require 'rack/test'
1447
1448 class MiAppTest < Test::Unit::TestCase
1449 include Rack::Test::Methods
1450
1451 def app
1452 Sinatra::Application
1453 end
1454
52d4311 @gnandretta improves Spanish README
gnandretta authored
1455 def test_mi_defecto
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
1456 get '/'
1457 assert_equal 'Hola Mundo!', last_response.body
1458 end
1459
1460 def test_con_parametros
1461 get '/saludar', :name => 'Franco'
52d4311 @gnandretta improves Spanish README
gnandretta authored
1462 assert_equal 'Hola Frank!', last_response.body
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
1463 end
1464
1465 def test_con_entorno_rack
1466 get '/', {}, 'HTTP_USER_AGENT' => 'Songbird'
1467 assert_equal "Estás usando Songbird!", last_response.body
1468 end
1469 end
1470
1471 NOTA: El módulo Sinatra::Test y la clase Sinatra::TestHarness están
1472 deprecados a partir de la versión 0.9.2.
1473
1474 == Sinatra::Base - Middleware, Librerías, y Aplicaciones Modulares
1475
1476 Definir tu aplicación en el top-level funciona bien para micro-aplicaciones
1477 pero trae inconvenientes considerables a la hora de construir componentes
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
1478 reutilizables como Rack middleware, Rails metal, simple librerías con un
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
1479 componente de servidor, o incluso extensiones de Sinatra. El DSL de top-level
1480 contamina el espacio de nombres de Object y asume una configuración apropiada
1481 para micro-aplicaciones (por ejemplo, un único archivo de aplicación, los
1482 directorios ./public y ./views, logging, página con detalles de excepción,
1483 etc.). Ahí es donde Sinatra::Base entra en el juego:
1484
1485 require 'sinatra/base'
1486
1487 class MiApp < Sinatra::Base
1488 set :sessions, true
1489 set :foo, 'bar'
1490
1491 get '/' do
1492 'Hola Mundo!'
1493 end
1494 end
1495
1496 Las subclases de Sinatra::Base tienen disponibles exactamente los mismos
1497 métodos que los provistos por el DSL de top-level. La mayoría de las
1498 aplicaciones top-level se pueden convertir en componentes Sinatra::Base con
1499 dos modificaciones:
1500
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
1501 * Tu archivo debe requerir <tt>sinatra/base</tt> en lugar de +sinatra+; de otra
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
1502 manera, todos los métodos del DSL de sinatra son importados dentro del
1503 espacio de nombres principal.
1504 * Poné las rutas, manejadores de errores, filtros y opciones de tu aplicación
1505 en una subclase de Sinatra::Base.
1506
c4b9fdc @rkh Yet another markup fix for the README.
rkh authored
1507 <tt>Sinatra::Base</tt> es una pizarra en blanco. La mayoría de las opciones están
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
1508 desactivadas por defecto, incluyendo el servidor incorporado. Mirá
1509 {Opciones y Configuraciones}[http://sinatra.github.com/configuration.html]
1510 para detalles sobre las opciones disponibles y su comportamiento.
1511
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
1512 === Estilo Modular vs. Clásico
1513
1514 Contrariamente a la creencia popular, no hay nada de malo con el estilo clásico.
1515 Si se ajusta a tu aplicación, no es necesario que la cambies a una modular.
1516
1517 Existen tan solo dos desventajas en comparación con el estilo modular:
1518
1519 * Solamente podés tener una aplicación Sinatra por proceso Ruby - si tenés
1520 planificado usar más, cambiá al estilo modular.
1521
1522 * El estilo clásico contamina Object con métodos delegadores - si tenés
1523 planificado empaquetar tu aplicación en una librería/gem, cambiá al estilo
1524 modular.
1525
1526 No hay ninguna razón por la cuál no puedas mezclar los estilos modular y
1527 clásico.
1528
1529 Cuando cambiés de un estilo al otro, tené en cuenta las sutiles diferencias
1530 entre sus configuraciones:
1531
1532 Configuración Clásica Modular
1533
1534 app_file archivo que carga sinatra nil
1535 run $0 == app_file false
1536 logging true false
1537 method_override true false
1538 inline_templates true false
5c66553 @gnandretta document static default value in spanish readme
gnandretta authored
1539 static true false
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
1540
54384ec @gnandretta use same capitalization for all headings in spanish readme
gnandretta authored
1541 === Sirviendo una Aplicación Modular
612f046 @gnandretta explain using run! vs config.run in spanish readme
gnandretta authored
1542
1543 Las dos opciones más comunes para iniciar una aplicación modular son, iniciarla
1544 activamente con <tt>run!</tt>:
1545
1546 # mi_app.rb
1547 require 'sinatra/base'
1548
1549 class MiApp < Sinatra::Base
1550 # ... código de la app ...
1551
1552 # iniciar el servidor si el archivo fue ejecutado directamente
1553 run! if app_file == $0
1554 end
1555
1556 Iniciar con:
1557
1558 ruby mi_app.rb
1559
1560 O, con un archivo <tt>config.ru</tt>, que permite usar cualquier handler Rack:
1561
1562 # config.ru
2145390 @rkh adjust readme examples so they work with 1.9.2 even if pwd is not on …
rkh authored
1563 require './mi_app'
612f046 @gnandretta explain using run! vs config.run in spanish readme
gnandretta authored
1564 run MiApp
1565
1566 Después ejecutar:
1567
1568 rackup -p 4567
1569
54384ec @gnandretta use same capitalization for all headings in spanish readme
gnandretta authored
1570 === Usando una Aplicación Clásica con un Archivo config.ru
612f046 @gnandretta explain using run! vs config.run in spanish readme
gnandretta authored
1571
1572 Escribí el archivo de tu aplicación:
1573
1574 # app.rb
1575 require 'sinatra'
1576
1577 get '/' do
1578 'Hola mundo!'
1579 end
1580
1581 Y el <tt>config.ru</tt> correspondiente:
1582
2145390 @rkh adjust readme examples so they work with 1.9.2 even if pwd is not on …
rkh authored
1583 require './app'
612f046 @gnandretta explain using run! vs config.run in spanish readme
gnandretta authored
1584 run Sinatra::Application
1585
54384ec @gnandretta use same capitalization for all headings in spanish readme
gnandretta authored
1586 === ¿Cuándo Usar config.ru?
612f046 @gnandretta explain using run! vs config.run in spanish readme
gnandretta authored
1587
1588 Indicadores de que probablemente querés usar <tt>config.ru</tt>:
1589
1590 * Querés realizar el deploy con un hanlder Rack distinto (Passenger, Unicorn,
1591 Heroku, ...).
1592 * Querés usar más de una subclase de <tt>Sinatra::Base</tt>.
1593 * Querés usar Sinatra únicamente para middleware, pero no como un endpoint.
1594
1595 <b>No hay necesidad de utilizar un archivo <tt>config.ru</tt> exclusivamente
1596 porque tenés una aplicación modular, y no necesitás una aplicación modular para
1597 iniciarla con <tt>config.ru</tt>.</b>
1598
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
1599 === Utilizando Sinatra como Middleware
1600
1601 Sinatra no solo es capaz de usar otro Rack middleware, sino que a su vez,
1602 cualquier aplicación Sinatra puede ser agregada delante de un endpoint Rack
1603 como middleware. Este endpoint puede ser otra aplicación Sinatra, o cualquier
79032f7 @gnandretta sync spanish readme, fixes #204
gnandretta authored
1604 aplicación basada en Rack (Rails/Ramaze/Camping/...):
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
1605
1606 require 'sinatra/base'
1607
78bb1d9 @gnandretta update REAMDE.es.rdoc
gnandretta authored
1608 class PantallaDeLogin < Sinatra::Base
e6887fe @andrewhampton Fix typo in middleware example.
andrewhampton authored
1609 enable :sessions
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
1610
1611 get('/login') { haml :login }
1612
1613 post('/login') do
1614 if params[:nombre] = 'admin' and params[:password] = 'admin'
1615 session['nombre_de_usuario'] = params[:nombre]
1616 else
1617 redirect '/login'
1618 end
1619 end
1620 end
1621
1622 class MiApp < Sinatra::Base
1623 # el middleware se ejecutará antes que los filtros
1624 use PantallaDeLogin
1625
1626 before do
1627 unless session['nombre_de_usuario']
1628 halt "Acceso denegado, por favor <a href='/login'>iniciá sesión</a>."
1629 end
1630 end
1631
1632 get('/') { "Hola #{session['nombre_de_usuario']}." }
1633 end
1634
e016efd @gnandretta document Sinatra.new in spanish readme
gnandretta authored
1635 === Creación Dinámica de Aplicaciones
1636
1637 Puede que en algunas ocasiones quieras crear nuevas aplicaciones en
1638 tiempo de ejecución sin tener que asignarlas a una constante. Para
ab2a2ed @rkh README markup fix
rkh authored
1639 esto tenés <tt>Sinatra.new</tt>:
e016efd @gnandretta document Sinatra.new in spanish readme
gnandretta authored
1640
1641 require 'sinatra/base'
1642 mi_app = Sinatra.new { get('/') { "hola" } }
1643 mi_app.run!
1644
1645 Acepta como argumento opcional una aplicación desde la que se
1646 heredará:
1647
1648 require 'sinatra/base'
1649
1650 controller = Sinatra.new do
1651 enable :logging
1652 helpers MisHelpers
1653 end
1654
1655 map('/a') do
1656 run Sinatra.new(controller) { get('/') { 'a' } }
1657 end
1658
1659 map('/b') do
1660 run Sinatra.new(controller) { get('/') { 'b' } }
1661 end
1662
1663 Construir aplicaciones de esta forma resulta especialmente útil para
1664 testear extensiones Sinatra o para usar Sinatra en tus librerías.
1665
1666 Por otro lado, hace extremadamente sencillo usar Sinatra como
1667 middleware:
1668
1669 require 'sinatra/base'
1670
1671 use Sinatra do
1672 get('/') { ... }
1673 end
1674
1675 run ProyectoRails::Application
1676
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
1677 == Ámbitos y Ligaduras
1678
1679 El ámbito en el que te encontrás determina que métodos y variables están
1680 disponibles.
1681
1682 === Ámbito de Aplicación/Clase
1683
1684 Cada aplicación Sinatra es una subclase de Sinatra::Base. Si estás usando el
1685 DSL de top-level (<tt>require 'sinatra'</tt>), entonces esta clase es
1686 Sinatra::Application, de otra manera es la subclase que creaste explícitamente.
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
1687 Al nivel de la clase tenés métodos como +get+ o +before+, pero no podés acceder
1688 a los objetos +request+ o +session+, ya que hay una única clase de la
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
1689 aplicación para todas las peticiones.
1690
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
1691 Las opciones creadas utilizando +set+ son métodos al nivel de la clase:
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
1692
796d62a @kryzhovnik README.* fixed typos
kryzhovnik authored
1693 class MiApp < Sinatra::Base
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
1694 # Ey, estoy en el ámbito de la aplicación!
1695 set :foo, 42
1696 foo # => 42
1697
1698 get '/foo' do
1699 # Hey, ya no estoy en el ámbito de la aplicación!
1700 end
1701 end
1702
1703 Tenés la ligadura al ámbito de la aplicación dentro de:
1704
1705 * El cuerpo de la clase de tu aplicación
1706 * Métodos definidos por extensiones
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
1707 * El bloque pasado a +helpers+
1708 * Procs/bloques usados como el valor para +set+
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
1709
1710 Este ámbito puede alcanzarse de las siguientes maneras:
1711
1712 * A través del objeto pasado a los bloques de configuración (<tt>configure { |c| ...}</tt>)
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
1713 * Llamando a +settings+ desde dentro del ámbito de la petición
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
1714
1715 === Ámbito de Petición/Instancia
1716
1717 Para cada petición entrante, una nueva instancia de la clase de tu aplicación
1718 es creada y todos los bloques de rutas son ejecutados en ese ámbito. Desde este
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
1719 ámbito podés acceder a los objetos +request+ y +session+ o llamar a los métodos
1720 de renderización como +erb+ o +haml+. Podés acceder al ámbito de la aplicación
1721 desde el ámbito de la petición utilizando +settings+:
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
1722
796d62a @kryzhovnik README.* fixed typos
kryzhovnik authored
1723 class MiApp < Sinatra::Base
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
1724 # Ey, estoy en el ámbito de la aplicación!
1725 get '/definir_ruta/:nombre' do
1726 # Ámbito de petición para '/definir_ruta/:nombre'
1727 @valor = 42
1728
1729 settings.get("/#{params[:nombre]}") do
1730 # Ámbito de petición para "/#{params[:nombre]}"
1731 @valor # => nil (no es la misma petición)
1732 end
1733
1734 "Ruta definida!"
1735 end
1736 end
1737
1738 Tenés la ligadura al ámbito de la petición dentro de:
1739
78bb1d9 @gnandretta update REAMDE.es.rdoc
gnandretta authored
1740 * bloques pasados a get/head/post/put/delete/options
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
1741 * filtros before/after
1742 * métodos ayudantes
1743 * plantillas/vistas
1744
1745 === Ámbito de Delegación
1746
1747 El ámbito de delegación solo reenvía métodos al ámbito de clase. De cualquier
1748 manera, no se comporta 100% como el ámbito de clase porque no tenés la ligadura
1749 de la clase: únicamente métodos marcados explícitamente para delegación están
1750 disponibles y no compartís variables/estado con el ámbito de clase (léase:
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
1751 tenés un +self+ diferente). Podés agregar delegaciones de método llamando a
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
1752 <tt>Sinatra::Delegator.delegate :nombre_del_metodo</tt>.
1753
1754 Tenés la ligadura al ámbito de delegación dentro de:
1755
1756 * La ligadura del top-level, si hiciste <tt>require "sinatra"</tt>
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
1757 * Un objeto extendido con el mixin <tt>Sinatra::Delegator</tt>
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
1758
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
1759 Pegale una mirada al código: acá está el
1760 {Sinatra::Delegator mixin}[http://github.com/sinatra/sinatra/blob/ceac46f0bc129a6e994a06100aa854f606fe5992/lib/sinatra/base.rb#L1128]
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
1761 que es {incluido en el espacio de nombres principal}[http://github.com/sinatra/sinatra/blob/ceac46f0bc129a6e994a06100aa854f606fe5992/lib/sinatra/main.rb#L28].
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
1762
54384ec @gnandretta use same capitalization for all headings in spanish readme
gnandretta authored
1763 == Línea de Comandos
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
1764
1765 Las aplicaciones Sinatra pueden ser ejecutadas directamente:
1766
1767 ruby miapp.rb [-h] [-x] [-e ENTORNO] [-p PUERTO] [-o HOST] [-s MANEJADOR]
1768
1769 Las opciones son:
1770
1771 -h # ayuda
1772 -p # asigna el puerto (4567 es usado por defecto)
1773 -o # asigna el host (0.0.0.0 es usado por defecto)
1774 -e # asigna el entorno (development es usado por defecto)
1775 -s # especifica el servidor/manejador rack (thin es usado por defecto)
1776 -x # activa el mutex lock (está desactivado por defecto)
1777
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
1778 == Requerimientos
1779
1780 Se recomienda instalar Sinatra en Ruby 1.8.7, 1.9.2, JRuby o Rubinius.
1781
1782 Las siguientes versiones de Ruby son soportadas oficialmente:
1783
1784 [ Ruby 1.8.6 ]
1785 No se recomienda utilizar Sinatra en 1.8.6. Sin embargo, esta versión será
1786 soportada oficialmente hasta que se libere Sinatra 1.3.0. RDoc y CoffeeScript
1787 no son soportadas por esta versión de Ruby. 1.8.6 contiene una falla
1788 importante de pérdida de memoria en su implementación de Hash, que afecta a
1789 las versiones de Sinatra anteriores a 1.1.1. La versión actual evita
1790 explícitamente esta falla a expensas de una disminución del rendimiento. Por
1791 último, Rack >= 1.2 dejó de soportar 1.8.6, por lo que vas a tener que usar
1792 alguna versión 1.1.x.
1793
1794 [ Ruby 1.8.7 ]
1795 1.8.7 es soportado completamente. Sin embargo, si no hay nada que te lo
1796 prohíba, te recomendamos que usés 1.9.2 o cambies a JRuby o Rubinius.
1797
1798 [ Ruby 1.9.2 ]
1799 1.9.2 es soportado y recomendado. Tené en cuenta que Radius y Markaby no
1800 son compatibles con 1.9 actualmente. Además, no usés 1.9.2p0, porque produce
1801 fallos de segmentación cuando se utiliza Sinatra.
1802
1803 [ Rubinius ]
e68e219 @gnandretta update supported versions in spanish readme
gnandretta authored
1804 Rubinius es soportado oficialmente (Rubinius >= 1.2.3). Todo
1805 funciona correctamente, incluyendo los lenguajes de plantillas.
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
1806
1807 [ JRuby ]
e68e219 @gnandretta update supported versions in spanish readme
gnandretta authored
1808 JRuby es soportado oficialmente (JRuby >= 1.6.0). No se conocen
1809 problemas con librerías de plantillas de terceras partes. Sin
1810 embargo, si elegís usar JRuby, deberías examinar sus Rack handlers
1811 porque el servidor web Thin no es soportado completamente. El
1812 soporte de JRuby para extensiones C se encuentra en una etapa
1813 experimental, sin embargo, de momento solo RDiscount se ve afectada.
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
1814
1815 Siempre le prestamos atención a las nuevas versiones de Ruby.
1816
1817 Las siguientes implementaciones de Ruby no se encuentran soportadas
1818 oficialmente. De cualquier manera, pueden ejecutar Sinatra:
1819
1820 * Versiones anteriores de JRuby y Rubinius
e68e219 @gnandretta update supported versions in spanish readme
gnandretta authored
1821 * MacRuby, Maglev e IronRuby
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
1822 * Ruby 1.9.0 y 1.9.1
1823
1824 No estar soportada oficialmente, significa que si las cosas solamente se rompen
1825 ahí y no en una plataforma soportada, asumimos que no es nuestro problema sino
1826 el suyo.
1827
e68e219 @gnandretta update supported versions in spanish readme
gnandretta authored
1828 Nuestro servidor CI también se ejecuta sobre ruby-head (que será la
1829 próxima versión 1.9.3). Como está en movimiento constante, no podemos
1830 garantizar nada. De todas formas, podés contar con que 1.9.3-p0 sea
1831 soportada.
1832
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
1833 Sinatra debería funcionar en cualquier sistema operativo soportado por la
1834 implementación de Ruby elegida.
1835
54384ec @gnandretta use same capitalization for all headings in spanish readme
gnandretta authored
1836 == A la Vanguardia
2f3c99a @gnandretta update 'A la Vanguardia' section in spanish readme
gnandretta authored
1837
1838 Si querés usar el código de Sinatra más reciente, sentite libre de ejecutar
1839 tu aplicación sobre la rama master, en general es bastante estable.
1840
1841 También liberamos prereleases de vez en cuando, así, podés hacer
1842
1843 gem install sinatra --pre
1844
1845 Para obtener algunas de las últimas características.
1846
68b6e0e @gnandretta recomend Bundler in 'A la Vanguardia' section in spanish readme
gnandretta authored
1847 === Con Bundler
1848
1849 Esta es la manera recomendada para ejecutar tu aplicación sobre la última
1850 versión de Sinatra usando {Bundler}[http://gembundler.com/].
1851
1852 Primero, instalá bundler si no lo hiciste todavía:
1853
1854 gem install bundler
1855
1856 Después, en el directorio de tu proyecto, creá un archivo +Gemfile+:
1857
1858 source :rubygems
1859 gem 'sinatra', :git => "git://github.com/sinatra/sinatra.git"
1860
1861 # otras dependencias
1862 gem 'haml' # por ejemplo, si usás haml
1863 gem 'activerecord', '~> 3.0' # quizás también necesités ActiveRecord 3.x
1864
1865 Tené en cuenta que tenés que listar todas las dependencias directas de tu
1866 aplicación. No es necesario listar las dependencias de Sinatra (Rack y Tilt)
1867 porque Bundler las agrega directamente.
1868
1869 Ahora podés arrancar tu aplicación así:
1870
1871 bundle exec ruby miapp.rb
1872
1873 === Con Git
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
1874
2f3c99a @gnandretta update 'A la Vanguardia' section in spanish readme
gnandretta authored
1875 Cloná el repositorio localmente y ejecutá tu aplicación, asegurándote que el
32b6e6f @gnandretta Spanish readme update - merges #191.
gnandretta authored
1876 directorio <tt>sinatra/lib</tt> esté en el <tt>$LOAD_PATH</tt>:
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
1877
1878 cd miapp
1879 git clone git://github.com/sinatra/sinatra.git
1880 ruby -Isinatra/lib miapp.rb
1881
1882 Para actualizar el código fuente de Sinatra en el futuro:
1883
619655c @gnandretta make paths consistent in spanish readme example
gnandretta authored
1884 cd miapp/sinatra
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
1885 git pull
1886
2f3c99a @gnandretta update 'A la Vanguardia' section in spanish readme
gnandretta authored
1887 === Instalación Global
1888
1889 Podés construir la gem vos mismo:
1890
1891 git clone git://github.com/sinatra/sinatra.git
1892 cd sinatra
1893 rake sinatra.gemspec
1894 rake install
1895
1896 Si instalás tus gems como root, el último paso debería ser
1897
1898 sudo rake install
1899
79032f7 @gnandretta sync spanish readme, fixes #204
gnandretta authored
1900 == Versionado
1901
1902 Sinatra utiliza el {Versionado Semántico}[http://semver.org/],
1903 siguiendo las especificaciones SemVer y SemVerTag.
1904
54384ec @gnandretta use same capitalization for all headings in spanish readme
gnandretta authored
1905 == Lecturas Recomendadas
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
1906
1907 * {Sito web del proyecto}[http://www.sinatrarb.com/] - Documentación
1908 adicional, noticias, y enlaces a otros recursos.
1909 * {Contribuyendo}[http://www.sinatrarb.com/contributing] - ¿Encontraste un
1910 error?. ¿Necesitás ayuda?. ¿Tenés un parche?.
a75b9ac @gnandretta syncs up the README spanish translation
gnandretta authored
1911 * {Seguimiento de problemas}[http://github.com/sinatra/sinatra/issues]
94022d6 @gnandretta Add README's spanish translation.
gnandretta authored
1912 * {Twitter}[http://twitter.com/sinatra]
1913 * {Lista de Correo}[http://groups.google.com/group/sinatrarb/topics]
1914 * {IRC: #sinatra}[irc://chat.freenode.net/#sinatra] en http://freenode.net
696acf2 @gnandretta add link to rubydoc.info in spanish readme
gnandretta authored
1915 * Documentación de la API para la
1916 {última versión liberada}[http://rubydoc.info/gems/sinatra] o para la
1917 {rama de desarrollo actual}[http://rubydoc.info/github/sinatra/sinatra]
1918 en http://rubydoc.info/
Something went wrong with that request. Please try again.