
El objetivo: evitar errores, olvidarse de la mayoría de los problemas de rendimiento y pasar más tiempo en el código en lugar de depurar y solucionar pruebas.
En resumen, haga que escribir aplicaciones web impresionantes sea rápida, divertida y fácil.
Lucky tiene un nuevo conjunto nuevo de guías que facilitan comenzar.
No dude en saludar o hacer preguntas en nuestra sala de chat.
O puede copiar una aplicación de trabajo real con Lucky Jumpstart.
Para instalar Lucky, lea la instalación de Guías Lucky para su sistema operativo. La guía lo guiará a través de la instalación de una utilidad de línea de comandos utilizada para generar nuevas aplicaciones afortunadas.
Manténgase al día siguiendo a @LuckyFramework en Twitter.
API (principal)
class Api::Users::Show < ApiAction
get " /api/users/:user_id " do
user = UserQuery .find(user_id)
json UserSerializer .new(user)
end
endget "/sign_in" para rutas sin REST.user_id porque hay un parámetro de ruta user_id .json para renderizar JSON. Extraer serializadores para respuestas JSON reutilizables. # Set up the model
class User < BaseModel
table do
column last_active_at : Time
column last_name : String
column nickname : String ?
end
end? al tipo cuando la columna puede ser nil . Crystal le ayudará a recordar no llamar a los métodos que no funcionarán.last_active_at y last_name ya que no están marcadas como nilables). # Add some methods to help query the database
class UserQuery < User::BaseQuery
def recently_active
last_active_at.gt( 1 .week.ago)
end
def sorted_by_last_name
last_name.lower.desc_order
end
end
# Query the database
UserQuery .new.recently_active.sorted_by_last_nameUser::BaseQuery se genera automáticamente cuando define un modelo. Heredar de él para personalizar consultas.lower en una columna String para asegurarse de que Postgres clasifique todo en minúsculas.gt para que los usuarios estén activos más de 1 semana hace 1 semana. Lucky tiene muchas abstracciones poderosas para crear consultas complejas y escribir métodos específicos (como lower ). class Users::Index < BrowserAction
get " /users " do
users = UserQuery .new.sorted_by_last_name
render IndexPage , users: users
end
end
class Users::IndexPage < MainLayout
needs users : UserQuery
def content
render_new_user_button
render_user_list
end
private def render_new_user_button
link " New User " , to: Users :: New
end
private def render_user_list
ul class: " user-list " do
users.each do | user |
li do
link user.name, to: Users :: Show .with(user.id)
text " - "
text user.nickname || " No Nickname "
end
end
end
end
endneeds users : UserQuery le dice al compilador que debe pasar a los usuarios del tipo UserQuery .Users::New . Pase los parámetros usando with : Users::Show.with(user.id) . No más tratando de recordar a los ayudantes de ruta y si el ayudante está pluralizado o no: si olvida pasar un parámetro a una ruta, Lucky le informará en el tiempo de compilación.column nickname : String? Como Nilable, Lucky no podría compilar la página si acaba de hacer nil text user.nickname Entonces, en su lugar, agregamos un "No Nickname" . ¡No más impresión accidental de texto vacío en HTML! Debe asegurarse de instalar las dependencias de cristal.
shards installcrystal spec de la raíz del proyecto. Ver contribuyente.md
Amamos a todos los miembros de la comunidad que han trabajado duro para mejorar la suerte. Si eres una de esas personas, ¡queremos darte una camiseta!
Para obtener una camisa, le pedimos que haya hecho una contribución significativa a Lucky. ¡Esto incluye cosas como enviar PRS con correcciones de errores e implementaciones de características, ayudar a otros miembros a trabajar a través de problemas e implementar aplicaciones del mundo real con Lucky!
Para reclamar su camisa, complete este formulario.
Paulcsmith Paul Smith - Creador original de Lucky
Hecho con contribuciones.
lucky watch basado en gran medida en Sentry. ¡Gracias @Samueleaton!