Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100644 2014 lines (1435 sloc) 63.397 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
2c7d340 Gabriel Andretta DRY-up the Views / Templates section in Spanish readme
gnandretta authored
360 Dependencias:: {haml}[http://haml-lang.com/]
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
ca7fbe5 Konstantin Haase Add documentation for Slim templates.
rkh authored
499 === Plantillas Slim
500
2c7d340 Gabriel Andretta DRY-up the Views / Templates section in Spanish readme
gnandretta authored
501 Dependencias:: {slim}[http://slim-lang.com/]
502 Extensiones de Archivo:: <tt>.slim</tt>
503 Ejemplo:: <tt>slim :index</tt>
ca7fbe5 Konstantin Haase Add documentation for Slim templates.
rkh authored
504
9ce9e54 Konstantin Haase add support for creole templates
rkh authored
505 === Plantillas Creole
506
2c7d340 Gabriel Andretta DRY-up the Views / Templates section in Spanish readme
gnandretta authored
507 Dependencias:: {creole}[https://github.com/minad/creole]
508 Extensiones de Archivo:: <tt>.creole</tt>
509 Ejemplo:: <tt>creole :wiki, :layout_engine => :erb</tt>
9ce9e54 Konstantin Haase add support for creole templates
rkh authored
510
2c7d340 Gabriel Andretta DRY-up the Views / Templates section in Spanish readme
gnandretta authored
511 No es posible llamar métodos desde creole, ni pasarle locales. Por lo tanto,
512 generalmente vas a usarlo en combinación con otro motor de renderizado:
a75b9ac Gabriel Andretta syncs up the README spanish translation
gnandretta authored
513
2c7d340 Gabriel Andretta DRY-up the Views / Templates section in Spanish readme
gnandretta authored
514 erb :resumen, :locals => { :texto => cerole(:introduccion) }
425c275 Gabriel Andretta update CoffeeScript section with requirements for ruby-coffeescript 2.x ...
gnandretta authored
515
2c7d340 Gabriel Andretta DRY-up the Views / Templates section in Spanish readme
gnandretta authored
516 Tené en cuenta que también podés llamar al método +creole+ desde otras
517 plantillas:
425c275 Gabriel Andretta update CoffeeScript section with requirements for ruby-coffeescript 2.x ...
gnandretta authored
518
2c7d340 Gabriel Andretta DRY-up the Views / Templates section in Spanish readme
gnandretta authored
519 %h1 Hola Desde Haml!
520 %p= creole(:saludos)
a75b9ac Gabriel Andretta syncs up the README spanish translation
gnandretta authored
521
2c7d340 Gabriel Andretta DRY-up the Views / Templates section in Spanish readme
gnandretta authored
522 Como no podés utilizar Ruby desde Creole, no podés usar layouts escritos en
523 Creloe. De todos modos, es posible usar un motor de renderizado para el layout
524 distinto al de la plantilla pasando la opción <tt>:layout_engine</tt>.
a75b9ac Gabriel Andretta syncs up the README spanish translation
gnandretta authored
525
2c7d340 Gabriel Andretta DRY-up the Views / Templates section in Spanish readme
gnandretta authored
526 === Plantillas CoffeeScript
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 Dependencias:: {coffee-script}[https://github.com/josh/ruby-coffee-script]
529 y un {mecanismo para ejecutar javascript}[https://github.com/sstephenson/execjs/blob/master/README.md#readme]
530 Extensiones de Archivo:: <tt>.coffee</tt>
531 Ejemplo:: <tt>coffee :index</tt>
a75b9ac Gabriel Andretta syncs up the README spanish translation
gnandretta authored
532
5d5d5bb Gabriel Andretta rename one of the two 'Plantillas Inline' to 'Plantillas Embebidas' in s...
gnandretta authored
533 === Plantillas Embebidas
94022d6 Gabriel Andretta Add README's spanish translation.
gnandretta authored
534
535 get '/' do
536 haml '%div.titulo Hola Mundo'
537 end
538
5d5d5bb Gabriel Andretta rename one of the two 'Plantillas Inline' to 'Plantillas Embebidas' in s...
gnandretta authored
539 Renderiza el template embebido en el string.
94022d6 Gabriel Andretta Add README's spanish translation.
gnandretta authored
540
541 === Accediendo a Variables en Plantillas
542
543 Las plantillas son evaluadas dentro del mismo contexto que los manejadores de
52d4311 Gabriel Andretta improves Spanish README
gnandretta authored
544 ruta. Las variables de instancia asignadas en los manejadores de ruta son
545 accesibles directamente por las plantillas:
94022d6 Gabriel Andretta Add README's spanish translation.
gnandretta authored
546
547 get '/:id' do
548 @foo = Foo.find(params[:id])
549 haml '%h1= @foo.nombre'
550 end
551
52d4311 Gabriel Andretta improves Spanish README
gnandretta authored
552 O es posible especificar un Hash de variables locales explícitamente:
94022d6 Gabriel Andretta Add README's spanish translation.
gnandretta authored
553
554 get '/:id' do
555 foo = Foo.find(params[:id])
bd7b791 Gabriel Andretta tweaked :locals example in Spanish readme
gnandretta authored
556 haml '%h1= bar.nombre', :locals => { :bar => foo }
94022d6 Gabriel Andretta Add README's spanish translation.
gnandretta authored
557 end
558
559 Esto es usado típicamente cuando se renderizan plantillas como parciales desde
560 adentro de otras plantillas.
561
562 === Plantillas Inline
563
564 Las plantillas pueden ser definidas al final del archivo fuente:
565
566 require 'rubygems'
567 require 'sinatra'
568
569 get '/' do
570 haml :index
571 end
572
573 __END__
574
575 @@ layout
576 %html
577 = yield
578
579 @@ index
580 %div.titulo Hola mundo!!!!!
581
582 NOTA: únicamente las plantillas inline definidas en el archivo fuente que
6584711 Konstantin Haase Minor markup fix in README.
rkh authored
583 requiere sinatra son cargadas automáticamente. Llamá <tt>enable
584 :inline_templates</tt> explícitamente si tenés plantillas inline en otros
94022d6 Gabriel Andretta Add README's spanish translation.
gnandretta authored
585 archivos fuente.
586
587 === Plantillas Nombradas
588
589 Las plantillas también pueden ser definidas usando el método top-level
590 <tt>template</tt>:
591
592 template :layout do
593 "%html\n =yield\n"
594 end
595
596 template :index do
597 '%div.titulo Hola Mundo!'
598 end
599
600 get '/' do
601 haml :index
602 end
603
604 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
605 una plantilla es renderizada. Podés desactivar los layouts individualmente
606 pasando <tt>:layout => false</tt> o globalmente con
79032f7 Gabriel Andretta sync spanish readme, fixes #204
gnandretta authored
607 <tt>set :haml, :layout => false</tt>:
94022d6 Gabriel Andretta Add README's spanish translation.
gnandretta authored
608
609 get '/' do
610 haml :index, :layout => !request.xhr?
611 end
612
e85b097 Gabriel Andretta add 'Asociando Extensiones de Archivo' section to spanish readme
gnandretta authored
613 === Asociando Extensiones de Archivo
614
615 Para asociar una extensión de archivo con un motor de renderizado, usá
616 <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
617 las plantillas Textile, podés hacer lo siguiente:
e85b097 Gabriel Andretta add 'Asociando Extensiones de Archivo' section to spanish readme
gnandretta authored
618
619 Tilt.register :tt, Tilt[:textile]
620
56bb2fc Gabriel Andretta add 'Agregando Tu Propio Motor de Renderizado' section to spanish readme
gnandretta authored
621 === Agregando Tu Propio Motor de Renderizado
622
623 Primero, registrá tu motor con Tilt, y después, creá tu método de renderizado:
624
625 Tilt.register :mipg, MiMotorParaPlantillaGenial
626
627 helpers do
628 def mypg(*args) render(:mypg, *args) end
629 end
630
631 get '/' do
632 mypg :index
633 end
634
635 Renderiza <tt>./views/index.mypg</tt>. Mirá https://github.com/rtomayko/tilt
636 para aprender más de Tilt.
637
52d4311 Gabriel Andretta improves Spanish README
gnandretta authored
638 == Filtros
94022d6 Gabriel Andretta Add README's spanish translation.
gnandretta authored
639
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
640 Los filtros +before+ son evaluados antes de cada petición dentro del mismo
641 contexto que las rutas. Pueden modificar la petición y la respuesta. Las
642 variables de instancia asignadas en los filtros son accesibles por las rutas y
643 las plantillas:
94022d6 Gabriel Andretta Add README's spanish translation.
gnandretta authored
644
645 before do
646 @nota = 'Hey!'
647 request.path_info = '/foo/bar/baz'
648 end
649
650 get '/foo/*' do
651 @nota #=> 'Hey!'
652 params[:splat] #=> 'bar/baz'
653 end
654
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
655 Los filtros +after+ son evaluados después de cada petición dentro del mismo
656 contexto y también pueden modificar la petición y la respuesta. Las variables
657 de instancia asignadas en los filtros +before+ y en las rutas son accesibles por
658 los filtros +after+:
94022d6 Gabriel Andretta Add README's spanish translation.
gnandretta authored
659
660 after do
661 puts response.status
662 end
663
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
664 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
665 string desde una ruta, el cuerpo de la respuesta no va a estar disponible en
666 un filtro after, debido a que todavía no se ha generado.
667
94022d6 Gabriel Andretta Add README's spanish translation.
gnandretta authored
668 Los filtros aceptan un patrón opcional, que cuando está presente causa que los
669 mismos sean evaluados únicamente si el path de la petición coincide con ese
670 patrón:
671
672 before '/protegido/*' do
673 autenticar!
674 end
675
676 after '/crear/:slug' do |slug|
677 session[:ultimo_slug] = slug
678 end
679
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
680 Al igual que las rutas, los filtros también pueden aceptar condiciones:
78bb1d9 Gabriel Andretta update REAMDE.es.rdoc
gnandretta authored
681
682 before :agent => /Songbird/ do
683 # ...
684 end
685
686 after '/blog/*', :host_name => 'ejemplo.com' do
687 # ...
688 end
689
170cca2 Gabriel Andretta reorganizing helpers in spanish readme
gnandretta authored
690 == Ayudantes
691
692 Usá el método top-level <tt>helpers</tt> para definir métodos ayudantes que
693 pueden ser utilizados dentro de los manejadores de rutas y las plantillas:
694
695 helpers do
696 def bar(nombre)
697 "#{nombre}bar"
698 end
699 end
700
701 get '/:nombre' do
702 bar(params[:nombre])
703 end
704
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
705 === Usando Sesiones
706
707 Una sesión es usada para mantener el estado a través de distintas peticiones.
708 Cuando están activadas, tenés un hash de sesión para cada sesión de usuario:
709
710 enable :sessions
711
712 get '/' do
713 "valor = " << session[:valor].inspect
714 end
715
716 get '/:valor' do
717 session[:valor] = params[:valor]
718 end
719
720 Tené en cuenta que <tt>enable :sessions</tt> guarda todos los datos en una
721 cookie, lo que no es siempre deseable (guardar muchos datos va a incrementar
722 tu tráfico, por citar un ejemplo). Podés usar cualquier middleware Rack para
723 manejar sesiones, de la misma manera que usarías cualquier otro middleware,
724 pero con la salvedad de que *no* tenés que llamar a <tt>enable :sessions</tt>:
725
726 use Rack::Session::Pool, :expire_after => 2592000
727
728 get '/' do
729 "valor = " << session[:valor].inspect
730 end
731
732 get '/:valor' do
733 session[:valor] = params[:valor]
734 end
735
6d7c4c0 Gabriel Andretta document session_secret in spanish readme
gnandretta authored
736 Para incrementar la seguridad, los datos de la sesión almacenados en
737 la cookie son firmados con un secreto de sesión. Este secreto, es
738 generado aleatoriamente por Sinatra. De cualquier manera, hay que
739 tener en cuenta que cada vez que inicies la aplicación se va a generar
740 uno nuevo. Así, si querés que todas las instancias de tu aplicación
741 compartan un único secreto, tenés que definirlo vos:
742
743 set :session_secret, 'super secreto'
744
670a100 Gabriel Andretta document sessions accepts a hash in spanish readme
gnandretta authored
745 Si necesitás una configuración más específica, +sessions+ acepta un
746 Hash con opciones:
747
748 set :sessions, :domain => 'foo.com'
749
170cca2 Gabriel Andretta reorganizing helpers in spanish readme
gnandretta authored
750 === Interrupción
94022d6 Gabriel Andretta Add README's spanish translation.
gnandretta authored
751
752 Para detener inmediatamente una petición dentro de un filtro o una ruta usá:
753
754 halt
755
a75b9ac Gabriel Andretta syncs up the README spanish translation
gnandretta authored
756 También podés especificar el estado:
94022d6 Gabriel Andretta Add README's spanish translation.
gnandretta authored
757
758 halt 410
759
a75b9ac Gabriel Andretta syncs up the README spanish translation
gnandretta authored
760 O el cuerpo:
94022d6 Gabriel Andretta Add README's spanish translation.
gnandretta authored
761
762 halt 'esto va a ser el cuerpo'
763
a75b9ac Gabriel Andretta syncs up the README spanish translation
gnandretta authored
764 O los dos:
94022d6 Gabriel Andretta Add README's spanish translation.
gnandretta authored
765
766 halt 401, 'salí de acá!'
767
a75b9ac Gabriel Andretta syncs up the README spanish translation
gnandretta authored
768 Con cabeceras:
94022d6 Gabriel Andretta Add README's spanish translation.
gnandretta authored
769
770 halt 402, { 'Content-Type' => 'text/plain' }, 'venganza'
771
5ca1df7 Gabriel Andretta add example for halt with template in spanish readme
gnandretta authored
772 Obviamente, es posible utilizar +halt+ con una plantilla:
773
774 halt erb(:error)
775
170cca2 Gabriel Andretta reorganizing helpers in spanish readme
gnandretta authored
776 === Paso
94022d6 Gabriel Andretta Add README's spanish translation.
gnandretta authored
777
778 Una ruta puede pasarle el procesamiento a la siguiente ruta que coincida con
779 la petición usando <tt>pass</tt>:
780
781 get '/adivina/:quien' do
782 pass unless params[:quien] == 'Franco'
783 'Adivinaste!'
784 end
785
786 get '/adivina/*' do
787 'Erraste!'
788 end
789
790 Se sale inmediatamente del bloque de la ruta y se le pasa el control a la
791 siguiente ruta que coincida. Si no coincide ninguna ruta, se devuelve un 404.
792
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
793 === Ejecutando Otra Ruta
794
795 Cuando querés obtener el resultado de la llamada a una ruta, +pass+ no te va a
796 servir. Para lograr esto, podés usar +call+:
797
798 get '/foo' do
66f1256 Konstantin Haase env is accessable directly, no need to use request.env
rkh authored
799 status, headers, body = call env.merge("PATH_INFO" => '/bar')
039675f Konstantin Haase test and fix #call example
rkh authored
800 [status, headers, body.map(&:upcase)]
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
801 end
802
803 get '/bar' do
804 "bar"
805 end
806
807 Notá que en el ejemplo anterior, es conveniente mover <tt>"bar"</tt> a un
808 helper, y llamarlo desde <tt>/foo</tt> y <tt>/bar</tt>. Así, vas a simplificar
809 las pruebas y a mejorar el rendimiento.
810
811 Si querés que la petición se envíe a la misma instancia de la aplicación en
812 lugar de a otra, usá <tt>call!</tt> en lugar de <tt>call</tt>.
813
814 En la especificación de Rack podés encontrar más información sobre
815 <tt>call</tt>.
816
817 === 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
818
819 Es posible, y se recomienda, asignar el código de estado y el cuerpo de una
820 respuesta con el valor de retorno de una ruta. De cualquier manera, en varios
821 escenarios, puede que sea conveniente asignar el cuerpo en un punto arbitrario
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
822 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
823 mismo método para acceder al cuerpo de la respuesta:
824
825 get '/foo' do
826 body "bar"
827 end
828
829 after do
830 puts body
831 end
832
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
833 También es posible pasarle un bloque a +body+, que será ejecutado por el Rack
834 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
835
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
836 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
837
838 get '/foo' do
839 status 418
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
840 headers \
9f69232 Konstantin Haase fix teapot example
rkh authored
841 "Allow" => "BREW, POST, GET, PROPFIND, WHEN",
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
842 "Refresh" => "Refresh: 20; http://www.ietf.org/rfc/rfc2324.txt"
843 body "I'm a tea pot!"
844 end
845
846 También, al igual que +body+, tanto +status+ como +headers+ pueden utilizarse
847 para obtener sus valores cuando no se les pasa argumentos.
848
28db748 Gabriel Andretta doc stream helper in Spanish readme
gnandretta authored
849 === Streaming De Respuestas
850
851 A veces vas a querer empezar a enviar la respuesta a pesar de que todavía no
852 terminaste de generar su cuerpo. También es posible que, en algunos casos,
853 quieras seguir enviando información hasta que el cliente cierre la conexión.
854 Cuando esto ocurra, el +stream+ helper te va a ser de gran ayuda:
855
856 get '/' do
857 stream do |out|
858 out << "Esto va a ser legen -\n"
859 sleep 0.5
860 out << " (esperalo) \n"
861 sleep 1
862 out << "- dario!\n"
863 end
864 end
865
866 Podés implementar APIs de streaming,
867 {Server-Sent Events}[http://dev.w3.org/html5/eventsource/] y puede ser usado
868 como base para {WebSockets}[http://es.wikipedia.org/wiki/WebSockets]. También
869 puede ser usado para incrementar el throughput si solo una parte del contenido
870 depende de un recurso lento.
871
872 Hay que tener en cuenta que el comportamiento del streaming, especialmente el
873 número de peticiones concurrentes, depende del servidor web utilizado para
874 servir la aplicación. Puede que algunos servidores, como es el caso de
875 WEBRick, no soporten streaming directamente, así el cuerpo de la respuesta será
876 enviado completamente de una vez cuando el bloque pasado a +stream+ finalice su
877 ejecución.
878
b7b2890 Konstantin Haase change the stream API while we still can
rkh authored
879 Cuando se pasa +keep_open+ como parámetro, no se va a enviar el mensaje
880 +close+ al objeto de stream. Queda en vos cerrarlo en el punto de ejecución
881 que quieras. Nuevamente, hay que tener en cuenta que este comportamiento es
882 posible solo en servidores que soporten eventos, como Thin o Rainbows. El
58445de Gabriel Andretta consistent colon in Spanish readme
gnandretta authored
883 resto de los servidores van a cerrar el stream de todos modos:
28db748 Gabriel Andretta doc stream helper in Spanish readme
gnandretta authored
884
885 set :server, :thin
886 conexiones = []
887
888 get '/' do
889 # mantenemos abierto el stream
b7b2890 Konstantin Haase change the stream API while we still can
rkh authored
890 stream(:keep_open) { |salida| conexiones << salida }
28db748 Gabriel Andretta doc stream helper in Spanish readme
gnandretta authored
891 end
892
893 post '/' do
894 # escribimos a todos los streams abiertos
895 conexiones.each { |salida| salida << params[:mensaje] << "\n" }
896 "mensaje enviado"
897 end
898
26ee26b Gabriel Andretta document logging in spanish readme
gnandretta authored
899 === Log (Registro)
900
901 En el ámbito de la petición, el helper +logger+ (registrador) expone
902 una instancia de +Logger+:
903
904 get '/' do
905 logger.info "cargando datos"
906 # ...
907 end
908
909 Este logger tiene en cuenta la configuración de logueo de tu Rack
910 handler. Si el logueo está desactivado, este método va a devolver un
911 objeto que se comporta como un logger pero que en realidad no hace
912 nada. Así, no vas a tener que preocuparte por esta situación.
913
914 Tené en cuenta que el logueo está habilitado por defecto únicamente
915 para <tt>Sinatra::Application</tt>. Si heredaste de
916 <tt>Sinatra::Base</tt>, probablemente quieras habilitarlo manualmente:
917
918 class MiApp < Sinatra::Base
919 configure(:production, :development) do
920 enable :logging
921 end
922 end
923
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
924 === Tipos Mime
925
926 Cuando usás <tt>send_file</tt> o archivos estáticos tal vez tengas tipos mime
927 que Sinatra no entiende. Usá +mime_type+ para registrarlos a través de la
928 extensión de archivo:
929
2c461ae Gabriel Andretta improve mime_type example in Spanish readme
gnandretta authored
930 configure do
931 mime_type :foo, 'text/foo'
932 end
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
933
934 También lo podés usar con el ayudante +content_type+:
935
936 get '/' do
937 content_type :foo
938 "foo foo foo"
252a8d0 Gabriel Andretta document body and status helper methods in spanish readme
gnandretta authored
939 end
940
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
941 === Generando URLs
942
943 Para generar URLs deberías usar el método +url+. Por ejemplo, en Haml:
944
945 %a{:href => url('/foo')} foo
946
947 Tiene en cuenta proxies inversos y encaminadores de Rack, si están presentes.
948
949 Este método también puede invocarse mediante su alias +to+ (mirá un ejemplo
950 a continuación).
951
5a22939 Gabriel Andretta document redirect in spanish readme
gnandretta authored
952 === Redirección del Navegador
953
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
954 Podés redireccionar al navegador con el método +redirect+:
5a22939 Gabriel Andretta document redirect in spanish readme
gnandretta authored
955
956 get '/foo' do
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
957 redirect to('/bar')
5a22939 Gabriel Andretta document redirect in spanish readme
gnandretta authored
958 end
959
960 Cualquier parámetro adicional se utiliza de la misma manera que los argumentos
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
961 pasados a +halt+:
962
963 redirect to('/bar'), 303
964 redirect 'http://google.com', 'te confundiste de lugar, compañero'
5a22939 Gabriel Andretta document redirect in spanish readme
gnandretta authored
965
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
966 También podés redireccionar fácilmente de vuelta hacia la página desde donde
967 vino el usuario con +redirect back+:
5a22939 Gabriel Andretta document redirect in spanish readme
gnandretta authored
968
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
969 get '/foo' do
970 "<a href='/bar'>hacer algo</a>"
971 end
972
973 get '/bar' do
974 hacer_algo
975 redirect back
976 end
977
978 Para pasar argumentos con una redirección, podés agregarlos a la cadena de
5a22939 Gabriel Andretta document redirect in spanish readme
gnandretta authored
979 búsqueda:
980
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
981 redirect to('/bar?suma=42')
5a22939 Gabriel Andretta document redirect in spanish readme
gnandretta authored
982
983 O usar una sesión:
984
e6ab1e8 Bucky Wolfe fix readme: enable :session => enable :sessions
Igneous authored
985 enable :sessions
5a22939 Gabriel Andretta document redirect in spanish readme
gnandretta authored
986
987 get '/foo' do
988 session[:secreto] = 'foo'
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
989 redirect to('/bar')
5a22939 Gabriel Andretta document redirect in spanish readme
gnandretta authored
990 end
991
992 get '/bar' do
993 session[:secreto]
994 end
995
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
996 === Cache Control
997
998 Asignar tus encabezados correctamente es el cimiento para realizar un cacheo
999 HTTP correcto.
1000
1001 Podés asignar el encabezado Cache-Control fácilmente:
1002
1003 get '/' do
1004 cache_control :public
1005 "cachealo!"
1006 end
1007
79032f7 Gabriel Andretta sync spanish readme, fixes #204
gnandretta authored
1008 Pro tip: configurar el cacheo en un filtro +before+:
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1009
1010 before do
1011 cache_control :public, :must_revalidate, :max_age => 60
1012 end
1013
1014 Si estás usando el helper +expires+ para definir el encabezado correspondiente,
1015 <tt>Cache-Control</tt> se va a definir automáticamente:
1016
1017 before do
1018 expires 500, :public, :must_revalidate
1019 end
1020
c2ba410 Gabriel Andretta slight changes regarding caching in Spanish readme
gnandretta authored
1021 Para usar cachés adecuadamente, deberías considerar usar +etag+ o
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1022 +last_modified+. Es recomendable que llames a estos helpers *antes* de hacer
1023 cualquier trabajo pesado, ya que van a enviar la respuesta inmediatamente si
79032f7 Gabriel Andretta sync spanish readme, fixes #204
gnandretta authored
1024 el cliente ya tiene la versión actual en su caché:
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1025
1026 get '/articulo/:id' do
1027 @articulo = Articulo.find params[:id]
1028 last_modified @articulo.updated_at
1029 etag @articulo.sha1
1030 erb :articulo
1031 end
1032
1033 También es posible usar una
1034 {weak ETag}[http://en.wikipedia.org/wiki/HTTP_ETag#Strong_and_weak_validation]:
1035
1036 etag @articulo.sha1, :weak
1037
1038 Estos helpers no van a cachear nada por vos, sino que van a facilitar la
1039 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
1040 de cacheo con proxys inversos, mirá
1041 {rack-cache}[http://rtomayko.github.com/rack-cache/]:
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1042
1043 require "rack/cache"
1044 require "sinatra"
1045
1046 use Rack::Cache
1047
1048 get '/' do
1049 cache_control :public, :max_age => 36000
1050 sleep 5
1051 "hola"
1052 end
1053
8475289 Gabriel Andretta doc :static_cache_control setting in Spanish readme
gnandretta authored
1054 Usá la configuración <tt>:static_cache_control</tt> para agregar el encabezado
1055 <tt>Cache-Control</tt> a archivos estáticos (ver la sección de configuración
1056 para más detalles).
1057
f602a16 Gabriel Andretta doc If-Match and If-None-Match in Spanish readme
gnandretta authored
1058 De acuerdo con la RFC 2616 tu aplicación debería comportarse diferente si a las
1059 cabeceras If-Match o If-None-Match se le asigna el valor <tt>*</tt> cuando el
1060 recurso solicitado ya existe. Sinatra asume para peticiones seguras (como get)
1061 e idempotentes (como put) que el recurso existe, mientras que para el resto
1062 (como post), que no. Podes cambiar este comportamiento con la opción
1063 <tt>:new_resource</tt>:
1064
1065 get '/crear' do
1066 etag '', :new_resource => true
1067 Articulo.create
1068 erb :nuevo_articulo
1069 end
1070
1071 Si querés seguir usando una weak ETag, indicalo con la opción <tt>:kind</tt>:
1072
1073 etag '', :new_resource => true, :kind => :weak
1074
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1075 === Enviando Archivos
1076
1077 Para enviar archivos, podés usar el método <tt>send_file</tt>:
1078
1079 get '/' do
1080 send_file 'foo.png'
1081 end
1082
1083 Además acepta un par de opciones:
1084
1085 send_file 'foo.png', :type => :jpg
1086
1087 Estas opciones son:
1088
1089 [filename]
1090 nombre del archivo respondido, por defecto es el nombre real del archivo.
1091
1092 [last_modified]
1093 valor para el encabezado Last-Modified, por defecto toma el mtime del archivo.
1094
1095 [type]
1096 el content type que se va a utilizar, si no está presente se intenta adivinar
1097 a partir de la extensión del archivo.
1098
1099 [disposition]
1100 se utiliza para el encabezado Content-Disposition, y puede tomar alguno de los
1101 siguientes valores: +nil+ (por defecto), <tt>:attachment</tt> e
1102 <tt>:inline</tt>
1103
1104 [length]
1105 encabezado Content-Length, por defecto toma el tamaño del archivo.
1106
1107 Si el Rack handler lo soporta, se intentará no transmitir directamente desde el
1108 proceso de Ruby. Si usás este método, Sinatra se va a encargar automáticamente
1109 peticiones de rango.
1110
170cca2 Gabriel Andretta reorganizing helpers in spanish readme
gnandretta authored
1111 === Accediendo al objeto de la petición
450c3c4 Gabriel Andretta syncs up the README's spanish translation
gnandretta authored
1112
1113 El objeto de la petición entrante puede ser accedido desde el nivel de la
1114 petición (filtros, rutas y manejadores de errores) a través del método
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1115 <tt>request</tt>:
450c3c4 Gabriel Andretta syncs up the README's spanish translation
gnandretta authored
1116
1117 # app corriendo en http://ejemplo.com/ejemplo
1118 get '/foo' do
06d9c7e Gabriel Andretta document more request methods in spanish readme
gnandretta authored
1119 t = %w[text/css text/html application/javascript]
1120 request.accept # ['text/html', '*/*']
1121 request.accept? 'text/xml' # true
1122 request.preferred_type(t) # 'text/html'
1123 request.body # cuerpo de la petición enviado por el cliente (ver más abajo)
1124 request.scheme # "http"
1125 request.script_name # "/ejemplo"
1126 request.path_info # "/foo"
1127 request.port # 80
1128 request.request_method # "GET"
1129 request.query_string # ""
1130 request.content_length # longitud de request.body
1131 request.media_type # tipo de medio de request.body
1132 request.host # "ejemplo.com"
1133 request.get? # true (hay métodos análogos para los otros verbos)
1134 request.form_data? # false
1135 request["UNA_CABECERA"] # valor de la cabecera UNA_CABECERA
1136 request.referrer # la referencia del cliente o '/'
1137 request.user_agent # user agent (usado por la condición :agent)
1138 request.cookies # hash de las cookies del browser
1139 request.xhr? # es una petición ajax?
1140 request.url # "http://ejemplo.com/ejemplo/foo"
1141 request.path # "/ejemplo/foo"
1142 request.ip # dirección IP del cliente
1143 request.secure? # false (sería true sobre ssl)
1144 request.forwarded? # true (si se está corriendo atrás de un proxy inverso)
1145 requuest.env # hash de entorno directamente entregado por Rack
450c3c4 Gabriel Andretta syncs up the README's spanish translation
gnandretta authored
1146 end
1147
1148 Algunas opciones, como <tt>script_name</tt> o <tt>path_info</tt> pueden
1149 también ser escritas:
1150
1151 before { request.path_info = "/" }
1152
1153 get "/" do
1154 "todas las peticiones llegan acá"
1155 end
1156
1157 El objeto <tt>request.body</tt> es una instancia de IO o StringIO:
1158
1159 post "/api" do
1160 request.body.rewind # en caso de que alguien ya lo haya leído
1161 datos = JSON.parse request.body.read
1162 "Hola #{datos['nombre']}!"
1163 end
1164
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1165 === Archivos Adjuntos
1166
1167 Podés usar el método helper +attachment+ para indicarle al navegador que
79032f7 Gabriel Andretta sync spanish readme, fixes #204
gnandretta authored
1168 almacene la respuesta en el disco en lugar de mostrarla en pantalla:
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1169
1170 get '/' do
1171 attachment
1172 "guardalo!"
1173 end
1174
1175 También podés pasarle un nombre de archivo:
1176
1177 get '/' do
1178 attachment "info.txt"
1179 "guardalo!"
1180 end
1181
b095000 Gabriel Andretta doc time_for in Spanish readme
gnandretta authored
1182 === Fecha y Hora
1183
1184 Sinatra pone a tu disposición el helper +time_for+, que genera un objeto +Time+
1185 a partir del valor que recibe como argumento. Este valor puede ser un
1186 +String+, pero también es capaz de convertir objetos +DateTime+, +Date+ y de
58445de Gabriel Andretta consistent colon in Spanish readme
gnandretta authored
1187 otras clases similares:
b095000 Gabriel Andretta doc time_for in Spanish readme
gnandretta authored
1188
1189 get '/' do
1190 pass if Time.now > time_for('Dec 23, 2012')
1191 "todavía hay tiempo"
1192 end
1193
1194 Este método es usado internamente por métodos como +expires+ y +last_modified+,
1195 entre otros. Por lo tanto, es posible extender el comportamiento de estos
1196 métodos sobreescribiendo +time_for+ en tu aplicación:
1197
1198 helpers do
1199 def time_for(value)
1200 case value
1201 when :ayer then Time.now - 24*60*60
1202 when :mañana then Time.now + 24*60*60
1203 else super
1204 end
1205 end
1206 end
1207
1208 get '/' do
1209 last_modified :ayer
1210 expires :mañana
1211 "hola"
1212 end
1213
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1214 === Buscando los Archivos de las Plantillas
1215
1216 El helper <tt>find_template</tt> se utiliza para encontrar los archivos de las
1217 plantillas que se van a renderizar:
1218
1219 find_template settings.views, 'foo', Tilt[:haml] do |archivo|
1220 puts "podría ser #{archivo}"
1221 end
1222
1223 Si bien esto no es muy útil, lo interesante es que podés sobreescribir este
1224 método, y así enganchar tu propio mecanismo de búsqueda. Por ejemplo, para
1225 poder utilizar más de un directorio de vistas:
1226
1227 set :views, ['vistas', 'plantillas']
1228
1229 helpers do
1230 def find_template(views, name, engine, &block)
1231 Array(views).each { |v| super(v, name, engine, &block) }
1232 end
1233 end
1234
1235 Otro ejemplo consiste en usar directorios diferentes para los distintos motores
1236 de renderizado:
1237
1238 set :views, :sass => 'vistas/sass', :haml => 'plantillas', :defecto => 'vistas'
1239
1240 helpers do
1241 def find_template(views, name, engine, &block)
1242 _, folder = views.detect { |k,v| engine == Tilt[k] }
1243 folder ||= views[:defecto]
1244 super(folder, name, engine, &block)
1245 end
1246 end
1247
1248 ¡Es muy fácil convertir estos ejemplos en una extensión y compartirla!.
1249
1250 Notá que <tt>find_template</tt> no verifica si un archivo existe realmente, sino
1251 que llama al bloque que recibe para cada path posible. Esto no representa un
1252 problema de rendimiento debido a que +render+ va a usar +break+ ni bien
1253 encuentre un archivo que exista. Además, las ubicaciones de las plantillas (y
1254 su contenido) se cachean cuando no estás en el modo de desarrollo. Es bueno
1255 tener en cuenta lo anteiror si escribís un método medio loco.
1256
94022d6 Gabriel Andretta Add README's spanish translation.
gnandretta authored
1257 == Configuración
1258
1259 Ejecutar una vez, en el inicio, en cualquier entorno:
1260
1261 configure do
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1262 # asignando una opción
1263 set :opcion, 'valor'
1264
1265 # asignando varias opciones
1266 set :a => 1, :b => 2
1267
1268 # atajo para `set :opcion, true`
1269 enable :opcion
1270
1271 # atajo para `set :opcion, false`
1272 disable :opcion
1273
1274 # también podés tener configuraciones dinámicas usando bloques
1275 set(:css_dir) { File.join(views, 'css') }
94022d6 Gabriel Andretta Add README's spanish translation.
gnandretta authored
1276 end
1277
1278 Ejecutar únicamente cuando el entorno (la variable de entorno RACK_ENV) es
1279 <tt>:production</tt>:
1280
1281 configure :production do
1282 ...
1283 end
1284
1285 Ejecutar cuando el entorno es <tt>:production</tt> o <tt>:test</tt>:
1286
1287 configure :production, :test do
1288 ...
1289 end
1290
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1291 Podés acceder a estas opciones utilizando el método <tt>settings</tt>:
1292
1293 configure do
1294 set :foo, 'bar'
1295 end
1296
1297 get '/' do
1298 settings.foo? # => true
1299 settings.foo # => 'bar'
1300 ...
1301 end
1302
e739e6c Gabriel Andretta doc attacks protection in Spanish readme
gnandretta authored
1303 ==== Configurando la Protección de Ataques
1304
1305 Sinatra usa {Rack::Protection}[https://github.com/rkh/rack-protection#readme]
1306 para defender a tu aplicación de los ataques más comunes. Tenés que tener en
1307 cuenta que como consecuencia de esto puede venir asociada una disminución del
1308 rendimiento de tu aplicación. Si por este, o algún otro motivo, querés
1309 desactivar está funcionalidad, podés hacerlo:
1310
1311 disable :protection
1312
1313 También es posible desactivar una única capa de defensa:
1314
1315 set :protection, :except => :path_traversal
1316
1317 O varias:
1318
1319 set :protections, :except => [:path_traversal, :session_hijacking]
1320
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1321 === Configuraciones Disponibles
1322
8475289 Gabriel Andretta doc :static_cache_control setting in Spanish readme
gnandretta authored
1323 [absolute_redirects] si está deshabilitada, Sinatra va a permitir
1324 redirecciones relativas, sin embargo, como consecuencia
1325 de esto, va a dejar de cumplir con el RFC 2616 (HTTP
1326 1.1), que solamente permite redirecciones absolutas.
1327
1328 Activalo si tu apliación está corriendo atrás de un proxy
1329 inverso que no se ha configurado adecuadamente. Notá que
1330 el helper +url+ va a seguir produciendo URLs absolutas, a
1331 menos que le pasés +false+ como segundo parámetro.
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1332
8475289 Gabriel Andretta doc :static_cache_control setting in Spanish readme
gnandretta authored
1333 Deshabilitada por defecto.
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1334
8475289 Gabriel Andretta doc :static_cache_control setting in Spanish readme
gnandretta authored
1335 [add_charsets] tipos mime a los que el helper <tt>content_type</tt> les
1336 añade automáticamente el charset.
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1337
8475289 Gabriel Andretta doc :static_cache_control setting in Spanish readme
gnandretta authored
1338 En general, no deberías asignar directamente esta opción,
1339 sino añadirle los charsets que quieras:
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1340
8475289 Gabriel Andretta doc :static_cache_control setting in Spanish readme
gnandretta authored
1341 settings.add_charsets << "application/foobar"
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1342
8475289 Gabriel Andretta doc :static_cache_control setting in Spanish readme
gnandretta authored
1343 [app_file] archivo principal de la aplicación, se utiliza para
1344 detectar la raíz del proyecto, el directorio de las
1345 vistas y el público así como las plantillas inline.
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1346
8475289 Gabriel Andretta doc :static_cache_control setting in Spanish readme
gnandretta authored
1347 [bind] dirección IP que utilizará el servidor integrado (por
1348 defecto: 0.0.0.0).
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1349
8475289 Gabriel Andretta doc :static_cache_control setting in Spanish readme
gnandretta authored
1350 [default_encoding] encoding utilizado cuando el mismo se desconoce (por
1351 defecto <tt>"utf-8"</tt>).
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1352
8475289 Gabriel Andretta doc :static_cache_control setting in Spanish readme
gnandretta authored
1353 [dump_errors] mostrar errores en el log.
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1354
8475289 Gabriel Andretta doc :static_cache_control setting in Spanish readme
gnandretta authored
1355 [environment] entorno actual, por defecto toma el valor de
1356 <tt>ENV['RACK_ENV']</tt>, o <tt>"development"</tt> si no
1357 está disponible.
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1358
8475289 Gabriel Andretta doc :static_cache_control setting in Spanish readme
gnandretta authored
1359 [logging] define si se utiliza el logger.
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1360
8475289 Gabriel Andretta doc :static_cache_control setting in Spanish readme
gnandretta authored
1361 [lock] coloca un lock alrededor de cada petición, procesando
1362 solamente una por proceso.
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1363
8475289 Gabriel Andretta doc :static_cache_control setting in Spanish readme
gnandretta authored
1364 Habilitá esta opción si tu aplicación no es thread-safe.
1365 Se encuentra deshabilitada por defecto.
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1366
8475289 Gabriel Andretta doc :static_cache_control setting in Spanish readme
gnandretta authored
1367 [method_override] utiliza el parámetro <tt>_method</tt> para permtir
1368 formularios put/delete en navegadores que no los
1369 soportan.
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1370
8475289 Gabriel Andretta doc :static_cache_control setting in Spanish readme
gnandretta authored
1371 [port] puerto en el que escuchará el servidor integrado.
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1372
8475289 Gabriel Andretta doc :static_cache_control setting in Spanish readme
gnandretta authored
1373 [prefixed_redirects] define si inserta <tt>request.script_name</tt> en las
1374 redirecciones cuando no se proporciona un path absoluto.
1375 De esta manera, cuando está habilitada,
1376 <tt>redirect '/foo'</tt> se comporta de la misma manera
1377 que <tt>redirect to('/foo')</tt>. Se encuentra
1378 deshabilitada por defecto.
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1379
e739e6c Gabriel Andretta doc attacks protection in Spanish readme
gnandretta authored
1380 [protection] define si deben activarse las protecciones para los
1381 ataques web más comunes. Para más detalles mirá la
1382 sección sobre la configuración de protección de ataques
1383 más arriba.
1384
d1ab58d Konstantin Haase rename public to public_folder, fixes #301
rkh authored
1385 [public_folder] directorio desde donde se sirven los archivos públicos.
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1386
8475289 Gabriel Andretta doc :static_cache_control setting in Spanish readme
gnandretta authored
1387 [reload_templates] define si se recargan las plantillas entre peticiones.
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1388
8475289 Gabriel Andretta doc :static_cache_control setting in Spanish readme
gnandretta authored
1389 Se encuentra activado en el entorno de desarrollo.
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1390
8475289 Gabriel Andretta doc :static_cache_control setting in Spanish readme
gnandretta authored
1391 [root] directorio raíz del proyecto.
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 [raise_errors] elevar excepciones (detiene la aplicación).
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1394
8475289 Gabriel Andretta doc :static_cache_control setting in Spanish readme
gnandretta authored
1395 [run] cuando está habilitada, Sinatra se va a encargar de
1396 iniciar el servidor web, no la habilités cuando estés
1397 usando rackup o algún otro medio.
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1398
8475289 Gabriel Andretta doc :static_cache_control setting in Spanish readme
gnandretta authored
1399 [running] indica si el servidor integrado está ejecutandose, ¡no
1400 cambiés esta configuración!.
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 [server] servidor, o lista de servidores, para usar como servidor
1403 integrado. Por defecto: ['thin', 'mongrel', 'webrick'],
1404 el orden establece la prioridad.
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1405
8475289 Gabriel Andretta doc :static_cache_control setting in Spanish readme
gnandretta authored
1406 [sessions] habilita sesiones basadas en cookies.
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 [show_exceptions] muestra un stack trace en el navegador.
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 [static] define si Sinatra debe encargarse de servir archivos
1411 estáticos.
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1412
8475289 Gabriel Andretta doc :static_cache_control setting in Spanish readme
gnandretta authored
1413 Deshabilitala cuando usés un servidor capaz de
1414 hacerlo por sí solo, porque mejorará el
1415 rendimiento. Se encuentra habilitada por
1416 defecto en el estilo clásico y desactivado en el
1417 el modular.
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 [static_cache_control] cuando Sinatra está sirviendo archivos estáticos, y
1420 está opción está habilitada, les va a agregar encabezados
1421 <tt>Cache-Control</tt> a las respuestas. Para esto
1422 utiliza el helper +cache_control+. Se encuentra
1423 deshabilitada por defecto. Notar que es necesario
1424 utilizar un array cuando se asignan múltiples valores:
1425 <tt>set :static_cache_control, [:public, :max_age => 300]</tt>.
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1426
8475289 Gabriel Andretta doc :static_cache_control setting in Spanish readme
gnandretta authored
1427 [views] directorio de las vistas.
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1428
54384ec Gabriel Andretta use same capitalization for all headings in spanish readme
gnandretta authored
1429 == Manejo de Errores
94022d6 Gabriel Andretta Add README's spanish translation.
gnandretta authored
1430
1431 Los manejadores de errores se ejecutan dentro del mismo contexto que las rutas
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1432 y los filtros +before+, lo que significa que podés usar, por ejemplo,
94022d6 Gabriel Andretta Add README's spanish translation.
gnandretta authored
1433 <tt>haml</tt>, <tt>erb</tt>, <tt>halt</tt>, etc.
1434
1435 === No encontrado <em>(Not Found)</em>
1436
1437 Cuando se eleva una excepción <tt>Sinatra::NotFound</tt>, o el código de
1438 estado de la respuesta es 404, el manejador <tt>not_found</tt> es invocado:
1439
1440 not_found do
1441 'No existo'
1442 end
1443
1444 === Error
1445
1446 El manejador +error+ es invocado cada vez que una excepción es elevada
1447 desde un bloque de ruta o un filtro. El objeto de la excepción se puede
1448 obtener de la variable Rack <tt>sinatra.error</tt>:
1449
1450 error do
1451 'Disculpá, ocurrió un error horrible - ' + env['sinatra.error'].name
1452 end
1453
1454 Errores personalizados:
1455
1456 error MiErrorPersonalizado do
66f1256 Konstantin Haase env is accessable directly, no need to use request.env
rkh authored
1457 'Lo que pasó fue...' + env['sinatra.error'].message
94022d6 Gabriel Andretta Add README's spanish translation.
gnandretta authored
1458 end
1459
1460 Entonces, si pasa esto:
1461
1462 get '/' do
1463 raise MiErrorPersonalizado, 'algo malo'
1464 end
1465
1466 Obtenés esto:
1467
1468 Lo que pasó fue... algo malo
1469
1470 También, podés instalar un manejador de errores para un código de estado:
1471
1472 error 403 do
1473 'Acceso prohibido'
1474 end
1475
1476 get '/secreto' do
1477 403
1478 end
1479
1480 O un rango:
1481
1482 error 400..510 do
1483 'Boom'
1484 end
1485
1486 Sinatra instala manejadores <tt>not_found</tt> y <tt>error</ttt> especiales
1487 cuando se ejecuta dentro del entorno de desarrollo "development".
1488
1489 == Rack Middleware
1490
1491 Sinatra corre sobre Rack[http://rack.rubyforge.org/], una interfaz minimalista
1492 que es un estándar para frameworks webs escritos en Ruby. Una de las
1493 capacidades más interesantes de Rack para los desarrolladores de aplicaciones
1494 es el soporte de "middleware" -- componentes que se ubican entre el servidor y
1495 tu aplicación, supervisando y/o manipulando la petición/respuesta HTTP para
1496 proporcionar varios tipos de funcionalidades comunes.
1497
1498 Sinatra hace muy sencillo construir tuberías de Rack middleware a través del
1499 método top-level +use+:
1500
1501 require 'sinatra'
1502 require 'mi_middleware_personalizado'
1503
1504 use Rack::Lint
1505 use MiMiddlewarePersonalizado
1506
1507 get '/hola' do
1508 'Hola Mundo'
1509 end
1510
1511 Las semánticas de +use+ son idénticas a las definidas para el DSL
52d4311 Gabriel Andretta improves Spanish README
gnandretta authored
1512 Rack::Builder[http://rack.rubyforge.org/doc/classes/Rack/Builder.html] (más
1513 frecuentemente usado desde archivos rackup). Por ejemplo, el método +use+
1514 acepta argumentos múltiples/variables así como bloques:
94022d6 Gabriel Andretta Add README's spanish translation.
gnandretta authored
1515
1516 use Rack::Auth::Basic do |nombre_de_usuario, password|
1517 nombre_de_usuario == 'admin' && password == 'secreto'
1518 end
1519
1520 Rack es distribuido con una variedad de middleware estándar para logging,
1521 debugging, enrutamiento URL, autenticación, y manejo de sesiones. Sinatra
1522 usa muchos de estos componentes automáticamente de acuerdo a su configuración
1523 para que típicamente no tengas que usarlas (con +use+) explícitamente.
1524
b3cfdce Gabriel Andretta links to middleware listings in Spanish readme
gnandretta authored
1525 Podés encontrar middleware útil en
1526 {rack}[https://github.com/rack/rack/tree/master/lib/rack],
1527 {rack-contrib}[https://github.com/rack/rack-contrib#readme],
1528 con {CodeRack}[http://coderack.org/] o en la
1529 {Rack wiki}[https://github.com/rack/rack/wiki/List-of-Middleware].
1530
52d4311 Gabriel Andretta improves Spanish README
gnandretta authored
1531 == Pruebas
94022d6 Gabriel Andretta Add README's spanish translation.
gnandretta authored
1532
52d4311 Gabriel Andretta improves Spanish README
gnandretta authored
1533 Las pruebas para las aplicaciones Sinatra pueden ser escritas utilizando
1534 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
1535 {Rack::Test}[http://rdoc.info/github/brynary/rack-test/master/frames]:
94022d6 Gabriel Andretta Add README's spanish translation.
gnandretta authored
1536
1537 require 'mi_app_sinatra'
a75b9ac Gabriel Andretta syncs up the README spanish translation
gnandretta authored
1538 require 'test/unit'
94022d6 Gabriel Andretta Add README's spanish translation.
gnandretta authored
1539 require 'rack/test'
1540
1541 class MiAppTest < Test::Unit::TestCase
1542 include Rack::Test::Methods
1543
1544 def app
1545 Sinatra::Application
1546 end
1547
52d4311 Gabriel Andretta improves Spanish README
gnandretta authored
1548 def test_mi_defecto
94022d6 Gabriel Andretta Add README's spanish translation.
gnandretta authored
1549 get '/'
1550 assert_equal 'Hola Mundo!', last_response.body
1551 end
1552
1553 def test_con_parametros
1554 get '/saludar', :name => 'Franco'
52d4311 Gabriel Andretta improves Spanish README
gnandretta authored
1555 assert_equal 'Hola Frank!', last_response.body
94022d6 Gabriel Andretta Add README's spanish translation.
gnandretta authored
1556 end
1557
1558 def test_con_entorno_rack
1559 get '/', {}, 'HTTP_USER_AGENT' => 'Songbird'
1560 assert_equal "Estás usando Songbird!", last_response.body
1561 end
1562 end
1563
1564 == Sinatra::Base - Middleware, Librerías, y Aplicaciones Modulares
1565
1566 Definir tu aplicación en el top-level funciona bien para micro-aplicaciones
1567 pero trae inconvenientes considerables a la hora de construir componentes
a75b9ac Gabriel Andretta syncs up the README spanish translation
gnandretta authored
1568 reutilizables como Rack middleware, Rails metal, simple librerías con un
94022d6 Gabriel Andretta Add README's spanish translation.
gnandretta authored
1569 componente de servidor, o incluso extensiones de Sinatra. El DSL de top-level
1570 contamina el espacio de nombres de Object y asume una configuración apropiada
1571 para micro-aplicaciones (por ejemplo, un único archivo de aplicación, los
cf83a2b Gabriel Andretta some markup fixes in Spanish readme
gnandretta authored
1572 directorios <tt>./public</tt> y <tt>./views</tt>, logging, página con detalles
1573 de excepción, etc.). Ahí es donde <tt>Sinatra::Base</tt> entra en el juego:
94022d6 Gabriel Andretta Add README's spanish translation.
gnandretta authored
1574
1575 require 'sinatra/base'
1576
1577 class MiApp < Sinatra::Base
1578 set :sessions, true
1579 set :foo, 'bar'
1580
1581 get '/' do
1582 'Hola Mundo!'
1583 end
1584 end
1585
cf83a2b Gabriel Andretta some markup fixes in Spanish readme
gnandretta authored
1586 Las subclases de <tt>Sinatra::Base</tt> tienen disponibles exactamente los
1587 mismos métodos que los provistos por el DSL de top-level. La mayoría de las
1588 aplicaciones top-level se pueden convertir en componentes
1589 <tt>Sinatra::Base</tt> con dos modificaciones:
94022d6 Gabriel Andretta Add README's spanish translation.
gnandretta authored
1590
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1591 * Tu archivo debe requerir <tt>sinatra/base</tt> en lugar de +sinatra+; de otra
94022d6 Gabriel Andretta Add README's spanish translation.
gnandretta authored
1592 manera, todos los métodos del DSL de sinatra son importados dentro del
1593 espacio de nombres principal.
1594 * Poné las rutas, manejadores de errores, filtros y opciones de tu aplicación
cf83a2b Gabriel Andretta some markup fixes in Spanish readme
gnandretta authored
1595 en una subclase de <tt>Sinatra::Base</tt>.
94022d6 Gabriel Andretta Add README's spanish translation.
gnandretta authored
1596
c4b9fdc Konstantin Haase Yet another markup fix for the README.
rkh authored
1597 <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
1598 desactivadas por defecto, incluyendo el servidor incorporado. Mirá
1599 {Opciones y Configuraciones}[http://sinatra.github.com/configuration.html]
1600 para detalles sobre las opciones disponibles y su comportamiento.
1601
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1602 === Estilo Modular vs. Clásico
1603
1604 Contrariamente a la creencia popular, no hay nada de malo con el estilo clásico.
1605 Si se ajusta a tu aplicación, no es necesario que la cambies a una modular.
1606
1607 Existen tan solo dos desventajas en comparación con el estilo modular:
1608
1609 * Solamente podés tener una aplicación Sinatra por proceso Ruby - si tenés
1610 planificado usar más, cambiá al estilo modular.
1611
1612 * El estilo clásico contamina Object con métodos delegadores - si tenés
1613 planificado empaquetar tu aplicación en una librería/gem, cambiá al estilo
1614 modular.
1615
1616 No hay ninguna razón por la cuál no puedas mezclar los estilos modular y
1617 clásico.
1618
1619 Cuando cambiés de un estilo al otro, tené en cuenta las sutiles diferencias
1620 entre sus configuraciones:
1621
1622 Configuración Clásica Modular
1623
9c666ee Gabriel Andretta doc new app_file default in Spanish readme
gnandretta authored
1624 app_file archivo que carga sinatra archivo con la subclase de Sinatra::Base
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1625 run $0 == app_file false
1626 logging true false
1627 method_override true false
1628 inline_templates true false
56bcd4c Gabriel Andretta document static default value in spanish readme
gnandretta authored
1629 static true false
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1630
54384ec Gabriel Andretta use same capitalization for all headings in spanish readme
gnandretta authored
1631 === Sirviendo una Aplicación Modular
612f046 Gabriel Andretta explain using run! vs config.run in spanish readme
gnandretta authored
1632
1633 Las dos opciones más comunes para iniciar una aplicación modular son, iniciarla
1634 activamente con <tt>run!</tt>:
1635
1636 # mi_app.rb
1637 require 'sinatra/base'
1638
1639 class MiApp < Sinatra::Base
1640 # ... código de la app ...
1641
1642 # iniciar el servidor si el archivo fue ejecutado directamente
1643 run! if app_file == $0
1644 end
1645
1646 Iniciar con:
1647
1648 ruby mi_app.rb
1649
1650 O, con un archivo <tt>config.ru</tt>, que permite usar cualquier handler Rack:
1651
1652 # config.ru
b6d589e Konstantin Haase adjust readme examples so they work with 1.9.2 even if pwd is not on the...
rkh authored
1653 require './mi_app'
612f046 Gabriel Andretta explain using run! vs config.run in spanish readme
gnandretta authored
1654 run MiApp
1655
1656 Después ejecutar:
1657
1658 rackup -p 4567
1659
54384ec Gabriel Andretta use same capitalization for all headings in spanish readme
gnandretta authored
1660 === 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
1661
1662 Escribí el archivo de tu aplicación:
1663
1664 # app.rb
1665 require 'sinatra'
1666
1667 get '/' do
1668 'Hola mundo!'
1669 end
1670
1671 Y el <tt>config.ru</tt> correspondiente:
1672
b6d589e Konstantin Haase adjust readme examples so they work with 1.9.2 even if pwd is not on the...
rkh authored
1673 require './app'
612f046 Gabriel Andretta explain using run! vs config.run in spanish readme
gnandretta authored
1674 run Sinatra::Application
1675
54384ec Gabriel Andretta use same capitalization for all headings in spanish readme
gnandretta authored
1676 === ¿Cuándo Usar config.ru?
612f046 Gabriel Andretta explain using run! vs config.run in spanish readme
gnandretta authored
1677
1678 Indicadores de que probablemente querés usar <tt>config.ru</tt>:
1679
1680 * Querés realizar el deploy con un hanlder Rack distinto (Passenger, Unicorn,
1681 Heroku, ...).
1682 * Querés usar más de una subclase de <tt>Sinatra::Base</tt>.
1683 * Querés usar Sinatra únicamente para middleware, pero no como un endpoint.
1684
1685 <b>No hay necesidad de utilizar un archivo <tt>config.ru</tt> exclusivamente
1686 porque tenés una aplicación modular, y no necesitás una aplicación modular para
1687 iniciarla con <tt>config.ru</tt>.</b>
1688
a75b9ac Gabriel Andretta syncs up the README spanish translation
gnandretta authored
1689 === Utilizando Sinatra como Middleware
1690
1691 Sinatra no solo es capaz de usar otro Rack middleware, sino que a su vez,
1692 cualquier aplicación Sinatra puede ser agregada delante de un endpoint Rack
1693 como middleware. Este endpoint puede ser otra aplicación Sinatra, o cualquier
79032f7 Gabriel Andretta sync spanish readme, fixes #204
gnandretta authored
1694 aplicación basada en Rack (Rails/Ramaze/Camping/...):
a75b9ac Gabriel Andretta syncs up the README spanish translation
gnandretta authored
1695
1696 require 'sinatra/base'
1697
78bb1d9 Gabriel Andretta update REAMDE.es.rdoc
gnandretta authored
1698 class PantallaDeLogin < Sinatra::Base
e6887fe Andrew Hampton Fix typo in middleware example.
andrewhampton authored
1699 enable :sessions
a75b9ac Gabriel Andretta syncs up the README spanish translation
gnandretta authored
1700
1701 get('/login') { haml :login }
1702
1703 post('/login') do
e67c5ae Gabriel Andretta fix Sinatra as middleware example in Spanish readme
gnandretta authored
1704 if params[:nombre] == 'admin' && params[:password] == 'admin'
a75b9ac Gabriel Andretta syncs up the README spanish translation
gnandretta authored
1705 session['nombre_de_usuario'] = params[:nombre]
1706 else
1707 redirect '/login'
1708 end
1709 end
1710 end
1711
1712 class MiApp < Sinatra::Base
1713 # el middleware se ejecutará antes que los filtros
1714 use PantallaDeLogin
1715
1716 before do
1717 unless session['nombre_de_usuario']
1718 halt "Acceso denegado, por favor <a href='/login'>iniciá sesión</a>."
1719 end
1720 end
1721
1722 get('/') { "Hola #{session['nombre_de_usuario']}." }
1723 end
1724
dbb4301 Gabriel Andretta document Sinatra.new in spanish readme
gnandretta authored
1725 === Creación Dinámica de Aplicaciones
1726
1727 Puede que en algunas ocasiones quieras crear nuevas aplicaciones en
1728 tiempo de ejecución sin tener que asignarlas a una constante. Para
89506b2 Konstantin Haase README markup fix
rkh authored
1729 esto tenés <tt>Sinatra.new</tt>:
dbb4301 Gabriel Andretta document Sinatra.new in spanish readme
gnandretta authored
1730
1731 require 'sinatra/base'
1732 mi_app = Sinatra.new { get('/') { "hola" } }
1733 mi_app.run!
1734
1735 Acepta como argumento opcional una aplicación desde la que se
1736 heredará:
1737
fd18d02 Gabriel Andretta point out that the example is a config.ru in the other readmes
gnandretta authored
1738 # config.ru
dbb4301 Gabriel Andretta document Sinatra.new in spanish readme
gnandretta authored
1739 require 'sinatra/base'
1740
1741 controller = Sinatra.new do
1742 enable :logging
1743 helpers MisHelpers
1744 end
1745
1746 map('/a') do
1747 run Sinatra.new(controller) { get('/') { 'a' } }
1748 end
1749
1750 map('/b') do
1751 run Sinatra.new(controller) { get('/') { 'b' } }
1752 end
1753
1754 Construir aplicaciones de esta forma resulta especialmente útil para
1755 testear extensiones Sinatra o para usar Sinatra en tus librerías.
1756
1757 Por otro lado, hace extremadamente sencillo usar Sinatra como
1758 middleware:
1759
1760 require 'sinatra/base'
1761
1762 use Sinatra do
1763 get('/') { ... }
1764 end
1765
1766 run ProyectoRails::Application
1767
a75b9ac Gabriel Andretta syncs up the README spanish translation
gnandretta authored
1768 == Ámbitos y Ligaduras
1769
1770 El ámbito en el que te encontrás determina que métodos y variables están
1771 disponibles.
1772
1773 === Ámbito de Aplicación/Clase
1774
cf83a2b Gabriel Andretta some markup fixes in Spanish readme
gnandretta authored
1775 Cada aplicación Sinatra es una subclase de <tt>Sinatra::Base</tt>. Si estás
1776 usando el DSL de top-level (<tt>require 'sinatra'</tt>), entonces esta clase es
1777 <tt>Sinatra::Application</tt>, de otra manera es la subclase que creaste
1778 explícitamente. Al nivel de la clase tenés métodos como +get+ o +before+, pero
1779 no podés acceder a los objetos +request+ o +session+, ya que hay una única
1780 clase de la aplicación para todas las peticiones.
a75b9ac Gabriel Andretta syncs up the README spanish translation
gnandretta authored
1781
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1782 Las opciones creadas utilizando +set+ son métodos al nivel de la clase:
a75b9ac Gabriel Andretta syncs up the README spanish translation
gnandretta authored
1783
796d62a Andrey Samsonov README.* fixed typos
kryzhovnik authored
1784 class MiApp < Sinatra::Base
a75b9ac Gabriel Andretta syncs up the README spanish translation
gnandretta authored
1785 # Ey, estoy en el ámbito de la aplicación!
1786 set :foo, 42
1787 foo # => 42
1788
1789 get '/foo' do
1790 # Hey, ya no estoy en el ámbito de la aplicación!
1791 end
1792 end
1793
1794 Tenés la ligadura al ámbito de la aplicación dentro de:
1795
1796 * El cuerpo de la clase de tu aplicación
1797 * Métodos definidos por extensiones
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1798 * El bloque pasado a +helpers+
1799 * Procs/bloques usados como el valor para +set+
a75b9ac Gabriel Andretta syncs up the README spanish translation
gnandretta authored
1800
1801 Este ámbito puede alcanzarse de las siguientes maneras:
1802
1803 * 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
1804 * Llamando a +settings+ desde dentro del ámbito de la petición
a75b9ac Gabriel Andretta syncs up the README spanish translation
gnandretta authored
1805
1806 === Ámbito de Petición/Instancia
1807
1808 Para cada petición entrante, una nueva instancia de la clase de tu aplicación
1809 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
1810 ámbito podés acceder a los objetos +request+ y +session+ o llamar a los métodos
1811 de renderización como +erb+ o +haml+. Podés acceder al ámbito de la aplicación
1812 desde el ámbito de la petición utilizando +settings+:
a75b9ac Gabriel Andretta syncs up the README spanish translation
gnandretta authored
1813
796d62a Andrey Samsonov README.* fixed typos
kryzhovnik authored
1814 class MiApp < Sinatra::Base
a75b9ac Gabriel Andretta syncs up the README spanish translation
gnandretta authored
1815 # Ey, estoy en el ámbito de la aplicación!
1816 get '/definir_ruta/:nombre' do
1817 # Ámbito de petición para '/definir_ruta/:nombre'
1818 @valor = 42
1819
1820 settings.get("/#{params[:nombre]}") do
1821 # Ámbito de petición para "/#{params[:nombre]}"
1822 @valor # => nil (no es la misma petición)
1823 end
1824
1825 "Ruta definida!"
1826 end
1827 end
1828
1829 Tenés la ligadura al ámbito de la petición dentro de:
1830
78bb1d9 Gabriel Andretta update REAMDE.es.rdoc
gnandretta authored
1831 * bloques pasados a get/head/post/put/delete/options
a75b9ac Gabriel Andretta syncs up the README spanish translation
gnandretta authored
1832 * filtros before/after
1833 * métodos ayudantes
1834 * plantillas/vistas
1835
1836 === Ámbito de Delegación
1837
1838 El ámbito de delegación solo reenvía métodos al ámbito de clase. De cualquier
1839 manera, no se comporta 100% como el ámbito de clase porque no tenés la ligadura
1840 de la clase: únicamente métodos marcados explícitamente para delegación están
1841 disponibles y no compartís variables/estado con el ámbito de clase (léase:
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1842 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
1843 <tt>Sinatra::Delegator.delegate :nombre_del_metodo</tt>.
1844
1845 Tenés la ligadura al ámbito de delegación dentro de:
1846
1847 * La ligadura del top-level, si hiciste <tt>require "sinatra"</tt>
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1848 * Un objeto extendido con el mixin <tt>Sinatra::Delegator</tt>
a75b9ac Gabriel Andretta syncs up the README spanish translation
gnandretta authored
1849
94022d6 Gabriel Andretta Add README's spanish translation.
gnandretta authored
1850 Pegale una mirada al código: acá está el
1851 {Sinatra::Delegator mixin}[http://github.com/sinatra/sinatra/blob/ceac46f0bc129a6e994a06100aa854f606fe5992/lib/sinatra/base.rb#L1128]
a75b9ac Gabriel Andretta syncs up the README spanish translation
gnandretta authored
1852 que es {incluido en el espacio de nombres principal}[http://github.com/sinatra/sinatra/blob/ceac46f0bc129a6e994a06100aa854f606fe5992/lib/sinatra/main.rb#L28].
94022d6 Gabriel Andretta Add README's spanish translation.
gnandretta authored
1853
54384ec Gabriel Andretta use same capitalization for all headings in spanish readme
gnandretta authored
1854 == Línea de Comandos
94022d6 Gabriel Andretta Add README's spanish translation.
gnandretta authored
1855
1856 Las aplicaciones Sinatra pueden ser ejecutadas directamente:
1857
1858 ruby miapp.rb [-h] [-x] [-e ENTORNO] [-p PUERTO] [-o HOST] [-s MANEJADOR]
1859
1860 Las opciones son:
1861
1862 -h # ayuda
1863 -p # asigna el puerto (4567 es usado por defecto)
1864 -o # asigna el host (0.0.0.0 es usado por defecto)
1865 -e # asigna el entorno (development es usado por defecto)
1866 -s # especifica el servidor/manejador rack (thin es usado por defecto)
1867 -x # activa el mutex lock (está desactivado por defecto)
1868
10534c1 Gabriel Andretta drop Ruby 1.8.6 support in spanish readme
gnandretta authored
1869 == Versiones de Ruby Soportadas
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1870
1871 Las siguientes versiones de Ruby son soportadas oficialmente:
1872
1873 [ Ruby 1.8.7 ]
1874 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
1875 prohíba, te recomendamos que usés 1.9.2 o cambies a JRuby o Rubinius. No se
1876 dejará de dar soporte a 1.8.7 hasta Sinatra 2.0 y Ruby 2.0, aunque si se
1877 libera la versión 1.8.8 de Ruby las cosas podrían llegar a cambiar. Sin
1878 embargo, que eso ocurra es muy poco probable, e incluso el caso de que lo
1879 haga, puede que se siga dando soporte a 1.8.7. <b>Hemos dejado de soportar
1880 Ruby 1.8.6.</b> Si querés ejecutar Sinatra sobre 1.8.6, podés utilizar la
1881 versión 1.2, pero tené en cuenta que una vez que Sinatra 1.4.0 sea liberado,
1882 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
1883
1884 [ Ruby 1.9.2 ]
1885 1.9.2 es soportado y recomendado. Tené en cuenta que Radius y Markaby no
1886 son compatibles con 1.9 actualmente. Además, no usés 1.9.2p0, porque produce
c5ce5b1 Gabriel Andretta change a word for a better one in Spanish readme
gnandretta authored
1887 fallos de segmentación cuando se ejecuta Sinatra.
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1888
1889 [ Rubinius ]
81fdb20 Gabriel Andretta update ruby version's support in Spanish readme
gnandretta authored
1890 Rubinius es soportado oficialmente (Rubinius >= 1.2.4). Todo
e68e219 Gabriel Andretta update supported versions in spanish readme
gnandretta authored
1891 funciona correctamente, incluyendo los lenguajes de plantillas.
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1892
1893 [ JRuby ]
81fdb20 Gabriel Andretta update ruby version's support in Spanish readme
gnandretta authored
1894 JRuby es soportado oficialmente (JRuby >= 1.6.3). No se conocen
e68e219 Gabriel Andretta update supported versions in spanish readme
gnandretta authored
1895 problemas con librerías de plantillas de terceras partes. Sin
1896 embargo, si elegís usar JRuby, deberías examinar sus Rack handlers
1897 porque el servidor web Thin no es soportado completamente. El
1898 soporte de JRuby para extensiones C se encuentra en una etapa
2dbc7bd Gabriel Andretta doc redcarpet problem with JRuby in Spanish readme
gnandretta authored
1899 experimental, sin embargo, de momento solamente RDiscount y Redcarpted
1900 se ven afectadas.
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1901
1902 Siempre le prestamos atención a las nuevas versiones de Ruby.
1903
1904 Las siguientes implementaciones de Ruby no se encuentran soportadas
1905 oficialmente. De cualquier manera, pueden ejecutar Sinatra:
1906
1907 * Versiones anteriores de JRuby y Rubinius
81fdb20 Gabriel Andretta update ruby version's support in Spanish readme
gnandretta authored
1908 * Ruby Enterprise Edition
e68e219 Gabriel Andretta update supported versions in spanish readme
gnandretta authored
1909 * MacRuby, Maglev e IronRuby
81fdb20 Gabriel Andretta update ruby version's support in Spanish readme
gnandretta authored
1910 * Ruby 1.9.0 y 1.9.1 (pero no te recomendamos que los usés)
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1911
1912 No estar soportada oficialmente, significa que si las cosas solamente se rompen
1913 ahí y no en una plataforma soportada, asumimos que no es nuestro problema sino
1914 el suyo.
1915
e68e219 Gabriel Andretta update supported versions in spanish readme
gnandretta authored
1916 Nuestro servidor CI también se ejecuta sobre ruby-head (que será la
81fdb20 Gabriel Andretta update ruby version's support in Spanish readme
gnandretta authored
1917 próxima versión 1.9.4). Como está en movimiento constante, no podemos
1918 garantizar nada. De todas formas, podés contar con que 1.9.4-p0 sea
e68e219 Gabriel Andretta update supported versions in spanish readme
gnandretta authored
1919 soportada.
1920
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1921 Sinatra debería funcionar en cualquier sistema operativo soportado por la
1922 implementación de Ruby elegida.
1923
81fdb20 Gabriel Andretta update ruby version's support in Spanish readme
gnandretta authored
1924 En este momento, no vas a poder ejecutar Sinatra en Cardinal, SmallRuby,
1925 BlueRuby o cualquier versión de Ruby anterior a 1.8.7.
1926
54384ec Gabriel Andretta use same capitalization for all headings in spanish readme
gnandretta authored
1927 == A la Vanguardia
2f3c99a Gabriel Andretta update 'A la Vanguardia' section in spanish readme
gnandretta authored
1928
1929 Si querés usar el código de Sinatra más reciente, sentite libre de ejecutar
1930 tu aplicación sobre la rama master, en general es bastante estable.
1931
1932 También liberamos prereleases de vez en cuando, así, podés hacer
1933
1934 gem install sinatra --pre
1935
1936 Para obtener algunas de las últimas características.
1937
68b6e0e Gabriel Andretta recomend Bundler in 'A la Vanguardia' section in spanish readme
gnandretta authored
1938 === Con Bundler
1939
1940 Esta es la manera recomendada para ejecutar tu aplicación sobre la última
1941 versión de Sinatra usando {Bundler}[http://gembundler.com/].
1942
1943 Primero, instalá bundler si no lo hiciste todavía:
1944
1945 gem install bundler
1946
1947 Después, en el directorio de tu proyecto, creá un archivo +Gemfile+:
1948
1949 source :rubygems
1950 gem 'sinatra', :git => "git://github.com/sinatra/sinatra.git"
1951
1952 # otras dependencias
1953 gem 'haml' # por ejemplo, si usás haml
1954 gem 'activerecord', '~> 3.0' # quizás también necesités ActiveRecord 3.x
1955
1956 Tené en cuenta que tenés que listar todas las dependencias directas de tu
1957 aplicación. No es necesario listar las dependencias de Sinatra (Rack y Tilt)
1958 porque Bundler las agrega directamente.
1959
1960 Ahora podés arrancar tu aplicación así:
1961
1962 bundle exec ruby miapp.rb
1963
1964 === Con Git
94022d6 Gabriel Andretta Add README's spanish translation.
gnandretta authored
1965
2f3c99a Gabriel Andretta update 'A la Vanguardia' section in spanish readme
gnandretta authored
1966 Cloná el repositorio localmente y ejecutá tu aplicación, asegurándote que el
32b6e6f Gabriel Andretta Spanish readme update - merges #191.
gnandretta authored
1967 directorio <tt>sinatra/lib</tt> esté en el <tt>$LOAD_PATH</tt>:
94022d6 Gabriel Andretta Add README's spanish translation.
gnandretta authored
1968
1969 cd miapp
1970 git clone git://github.com/sinatra/sinatra.git
1971 ruby -Isinatra/lib miapp.rb
1972
1973 Para actualizar el código fuente de Sinatra en el futuro:
1974
619655c Gabriel Andretta make paths consistent in spanish readme example
gnandretta authored
1975 cd miapp/sinatra
94022d6 Gabriel Andretta Add README's spanish translation.
gnandretta authored
1976 git pull
1977
2f3c99a Gabriel Andretta update 'A la Vanguardia' section in spanish readme
gnandretta authored
1978 === Instalación Global
1979
1980 Podés construir la gem vos mismo:
1981
1982 git clone git://github.com/sinatra/sinatra.git
1983 cd sinatra
1984 rake sinatra.gemspec
1985 rake install
1986
1987 Si instalás tus gems como root, el último paso debería ser
1988
1989 sudo rake install
1990
79032f7 Gabriel Andretta sync spanish readme, fixes #204
gnandretta authored
1991 == Versionado
1992
1993 Sinatra utiliza el {Versionado Semántico}[http://semver.org/],
1994 siguiendo las especificaciones SemVer y SemVerTag.
1995
54384ec Gabriel Andretta use same capitalization for all headings in spanish readme
gnandretta authored
1996 == Lecturas Recomendadas
94022d6 Gabriel Andretta Add README's spanish translation.
gnandretta authored
1997
1998 * {Sito web del proyecto}[http://www.sinatrarb.com/] - Documentación
1999 adicional, noticias, y enlaces a otros recursos.
2000 * {Contribuyendo}[http://www.sinatrarb.com/contributing] - ¿Encontraste un
2001 error?. ¿Necesitás ayuda?. ¿Tenés un parche?.
a75b9ac Gabriel Andretta syncs up the README spanish translation
gnandretta authored
2002 * {Seguimiento de problemas}[http://github.com/sinatra/sinatra/issues]
94022d6 Gabriel Andretta Add README's spanish translation.
gnandretta authored
2003 * {Twitter}[http://twitter.com/sinatra]
2004 * {Lista de Correo}[http://groups.google.com/group/sinatrarb/topics]
2005 * {IRC: #sinatra}[irc://chat.freenode.net/#sinatra] en http://freenode.net
3c57794 Gabriel Andretta add book and book-contrib links to Spanish readme
gnandretta authored
2006 * {Sinatra Book}[http://sinatra-book.gittr.com] Tutorial (en inglés).
2007 * {Sinatra Book Contrib}[http://sinatra-book-contrib.com/] Recetas contribuidas
2008 por la comunidad (en inglés).
afe9ddf Gabriel Andretta add link to rubydoc.info in spanish readme
gnandretta authored
2009 * Documentación de la API para la
2010 {última versión liberada}[http://rubydoc.info/gems/sinatra] o para la
2011 {rama de desarrollo actual}[http://rubydoc.info/github/sinatra/sinatra]
2012 en http://rubydoc.info/
723649a Gabriel Andretta add link to CI server in Spanish readme
gnandretta authored
2013 * {Servidor de IC}[http://ci.rkh.im/view/Sinatra/]