# Chili Have you ever wanted to test out a new feature on only a subset of users? Did that implementation end up being lots of if/else statements embedded in the main code? If so, Chili can help. Chili is built on top of Rails Engines and Deface and allows you to conditionally add new/modify existing views, while leaving the main code untouched. ## Installation Install Chili on your system (not in your app!): gem install chili ## Usage Just like engines chili extensions are like mini apps that are created separately from the main app using the "chili" command. ### Creating a new chili extension Assuming you want to add a new extension that adds exposes a new social feature such as a "like" button feature to a subset of users, first run: chili social # social is the name of the extension This is basically a shortcut for running the `rails plugin new` engine generator with a custom template and will: 1. Create a directory named chili_social containing the basic structure for the extension 2. Clone the app you are adding the extension to as a submodule into chili_social/main_app 3. Add a reference to the extensions gemspec to the main app gemfile for testing ### Define who can see the extension Use the active_if block to control whether new controllers/overrides are visible or not. The context of the active_if block is the application controller so you can use any methods available to that. ```ruby # lib/chili_social.rb module ChiliSocial extend Chili::Activatable active_if { logged_in? && current_user.admin? } # Extension is only visible to logged in admin users end ``` ### Modifying view templates in main app Chili uses deface to modify existing view templates (see [deface docs](https://github.com/railsdog/deface#using-the-deface-dsl-deface-files) for details) Add overrides to the `app/overides` directory mirroing the path of the view you want to modify. For example, assuming the main app has the partial `app/views/posts/_post.html.erb`: ```erb <% # app/overrides/posts/_post/like_button.html.erb.deface (folder should mirror main app view path) %>