Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

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