Lucky v0.20 has built-in pagination, AvramSlugify for generating slugs, built-in soft delete helpers, and much more.
Lucky v0.20 is out now and works with the newest version of Crystal (v0.34.0)
Be sure to upgrade your version of Crystal, and take a look at our UPGRADE NOTES for help with migrating your app.
Note: this release has some warnings from Crystal 0.34. Don’t worry, these warnings do not affect functionality and will be addressed in a release coming in the next couple weeks. Stay tuned!
This release has tons of big new features, improvements, and bug fixes. You can see a detailed list on our CHANGELOG.
Nearly every web application or API needs to paginate records, and it is now much easier with Lucky 0.20.
paginate method in actions will paginate the query and return
pagination metadata used to build page navigation.
class Users::Index < BrowserAction get "/users" do pages, users = paginate(UserQuery.new) html IndexPage, pages: pages, users: users end end
Then use one of our built-in HTML components:
# Built-in components for Bulma, Bootstrap, and raw HTML mount Lucky::Paginator::BulmaNav.new(pages)
Don’t worry, you can copy one of the built-in components into your app and customize as much as you want!
Or add metadata to API responses:
class Users::Index < BrowserAction get "/users" do pages, users = paginate(UserQuery.new) # Render pagination metadata response.headers["Next-Page"] = pages.path_for_next json UserSerializer.for_collection(users) end end
See all the details and options in the new pagination guide.
Creating a slug for prettier URLs and permalinks is common in web applications. It’s now easier than ever with the new official shard, AvramSlugify.
class SaveArticle < Article::SaveOperation before_save do AvramSlugify.set slug, using: title, query: ArticleQuery.new end end
This will set the column
slug to a slugified version of the
and check that the slug is unique using
So if someone created a post with a title of
"Lucky rocks!" the slug would be
"lucky-rocks". See full usage details in
the AvramSlugify README.
Sometimes you don’t want to actually delete a record right away, but instead want to “soft delete” it and stop showing it to users. This is a good safety mechanism and even allows you to later restore the record if you want it back.
Here’s a quick example:
comment = CommentQuery.first comment.soft_delete CommentQuery.new.only_kept.count # 0 CommentQuery.new.only_soft_deleted.count # 1 comment.restore CommentQuery.new.only_kept.count # 1 CommentQuery.new.only_soft_deleted.count # 0
Take a look at the soft delete guide to learn how to only show kept records by default, see other helpful methods, and learn how to set it up.
Lucky v0.20 now has a
script/system_check that runs at the start of
script/setup and whenever you start your dev server with
It will make sure Postgres is up and running, and required dependencies are installed. You can modify this script to add your own system checks as well. For example, you can check that ElasticSearch is installed and running.
Read all about it in the script/system_check guide.
We’re very excited about this release, and hope you are too. Please give it a spin and help us find bugs so our next release is even more solid. If you find any issues, don’t hesitate to report the issue. If you’re unsure, just hop on gitter chat so we can help you out.
Thanks so much for the support!
For questions, or just to chat, come say hi on gitter.