# Xpose [![Gem Version](https://img.shields.io/gem/v/xpose.svg)](https://rubygems.org/gems/xpose) ## Presentation **Xpose** provides a set of helpers that help you write smaller, cleaner controllers. ## Installation Add this line to your application's Gemfile: ```ruby gem 'xpose' ``` And then execute: ```shell bundle install ``` ## Basic usage Here is a basic scaffolded controller in Rails (comments removed): ```ruby class ArticlesController < ApplicationController before_action :set_article, only: [:show, :edit, :update, :destroy] def index @articles = Article.all end def show end def new @article = Article.new end def edit end def create @article = Article.new(article_params) respond_to do |format| if @article.save format.html { redirect_to @article, notice: 'Article was successfully created.' } format.json { render :show, status: :created, location: @article } else format.html { render :new } format.json { render json: @article.errors, status: :unprocessable_entity } end end end def update respond_to do |format| if @article.update(article_params) format.html { redirect_to @article, notice: 'Article was successfully updated.' } format.json { render :show, status: :ok, location: @article } else format.html { render :edit } format.json { render json: @article.errors, status: :unprocessable_entity } end end end def destroy @article.destroy respond_to do |format| format.html { redirect_to articles_url, notice: 'Article was successfully destroyed.' } format.json { head :no_content } end end private def set_article @article = Article.find(params[:id]) end def article_params params.require(:article).permit(:name, :content) end end ``` Here is the Xpose-friendly equivalent: ```ruby class ArticlesController < ApplicationController expose :articles expose :article def index end def show end def new end def create if article.save redirect_to article, notice: 'Article was successfully created.' else render :new end end def edit end def update if article.update(article_params) redirect_to article, notice: 'Article was successfully updated.' else render :edit end end def destroy article.destroy redirect_to articles_url, notice: 'Article was successfully destroyed.' end private def article_params params.require(:article).permit(:name) end end ``` ## Helpers ### expose `expose` provides powerful tools to help you minimize your controllers. Default values: `expose :name, :infer, scope: :all, decorate: true, decorator: :infer` Examples: ```ruby expose :articles expose :articles, scope: :visible expose :article expose :forthy_two, 42, decorate: false expose :bob, "Bob", decorator: -> { |v| v.length } ``` ## Usage TODO ## Development After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment. To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org). ## Contributing Bug reports and pull requests are welcome on GitHub at https://github.com/yoones/xpose. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct. ## License The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT). ## Code of Conduct Everyone interacting in the Xpose project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/yoones/xpose/blob/master/CODE_OF_CONDUCT.md).