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