2011-05-03 11 views
10

Me preguntaron por qué "estaba creando variables complejas de Ruby en mi vista. ¿No debería haber declarado estas variables mi controlador?"¿Qué es un controlador en Sinatra?

¿Mi controlador sinatra mi .rb archivo? Tengo un archivo .rb y veo vistas.

Respuesta

6

Cada ruta Sinatra se puede considerar su propio controlador en un típico MVC s etup. Para su ejemplo:

require 'sinatra' 
require 'json' 
get "/foo" do 
    # This might take many lines of excellent code to form your data 
    @data = some_complex_array_hash_combo 
    haml :foo 
end 

Y luego, en foo.haml:

:javascript 
    var data = #{@data.to_json}; 
+0

¿Por qué tengo que usar '@ data' y no' data'? – Radek

+2

@Radek Debido a que las variables de instancia están disponibles para la plantilla de Haml por Sinatra 'haml' helper, pero las variables locales no lo son. – Phrogz

6

Sinatra fuera de la caja no tiene un marco MVC estándar. Entonces, si bien no quiere dejar todo en el archivo de vista principal, técnicamente tampoco tiene un "controlador" para instalarlo. La división de la aplicación en diferentes funcionalidades sería probablemente la mejor manera de hacerlo simple. Extienda grandes áreas de funcionalidad en clases separadas y cosas pequeñas en bibliotecas de ayuda.

En cuanto a cómo otros hacen esto podría ayudar a cabo, este puesto debe tener algunos buenos ejemplos para su estudio: https://stackoverflow.com/questions/2075758/real-life-examples-of-sinatra-applications

Si un framework MVC se convierte en algo que realmente cree que necesita, echar un vistazo a Padrino (http://padrinorb.com)

poste Ligeramente relacionados:

https://softwareengineering.stackexchange.com/questions/14293/ruby-sinatra-best-practices-for-project-structure

+0

¿Qué es una biblioteca de ayuda? – Radek

+0

Los ayudantes son clases destinadas a ayudar a las vistas. http://ididitmyway.heroku.com/past/2010/4/25/sinatra_helpers/ – Tyler

17

Puede configurar la idea de controladores mediante la práctica (en 1.9.2) esta en la parte superior de su archivo principal .rb

Dir.glob("controllers/*.rb").each { |r| require_relative r } 

Esto require_relative cada archivo .rb en unos controladores carpeta llamada/

Desde allí puede implementar el enrutamiento normal como lo hubiera hecho anteriormente en el archivo .rb principal. Por favor, eche un vistazo a rstat.us en Github.

Editar: Rstat.us se ha ido rails3 y, si bien sigue siendo útil, es posible que tenga que retroceder numerosos commits en la rama principal para encontrar cómo se usó.

+0

Este comentario merece más karma. Muy útil. ¡Gracias! –

+0

@ j33r gracias! muy apreciado. –

1

@CaleyWoods: gracias por la referencia a rstat.us

Para aquellos que están buscando para la versión de Sinatra, aquí hay un enlace a una Sinatra comprometerse: https://github.com/hotsh/rstat.us/tree/00b27505681d80b3943fd9b9e9791f664a04cf39

(por lo que don' t tiene que atravesar el historial de commit ;-))

+0

y https://github.com/hotsh/rstat.us/blob/00b27505681d80b3943fd9b9e9791f664a04cf39/rstatus.rb#L79 L # 79 muestra la instrucción Dir.glob que le permite utilizar una carpeta/controladores. –

0

Esto es solo por herencia más adelante si tiene controladores que heredan de ApplicationController. ¡Buena suerte! Si usa un archivo config.ru para su aplicación, esto puede ayudar.

require 'active_support' 
require 'sinatra/base' 

APP_ROOT = Pathname.new(File.expand_path('../', __FILE__)) 

# We have to do this in case we have controllers that inherit from each other. 
Dir[APP_ROOT.join('app', 'controllers', '*.rb')].each do |controller_file| 
    filename = File.basename(controller_file).gsub('.rb', '') 
    autoload ActiveSupport::Inflector.camelize(filename), controller_file 
end 

Esto supone poner ese código en su config.ru pero se puede poner en su expediente de solicitud también y asegúrese de ajustar la estructura de directorios.

Cuestiones relacionadas