denispeplin/link_to_action

View on GitHub
README.md

Summary

Maintainability
Test Coverage
[![Code Climate](https://codeclimate.com/github/denispeplin/link_to_action.png)](https://codeclimate.com/github/denispeplin/link_to_action)
[![Build Status](https://secure.travis-ci.org/denispeplin/link_to_action.png)](http://travis-ci.org/denispeplin/link_to_action)
[![Gem Version](https://fury-badge.herokuapp.com/rb/link_to_action.png)](http://badge.fury.io/rb/link_to_action)

# DISCLAIMER: THE PROJECT IS NOT ACTIVELY MAINTAINED AND NEEDS REFACTORING.

# LinkToAction

Set of helpers: link_to_new, link_to_index, link_to_show, link_to_edit, link_to_destroy

Bonus helper: link_to_back

Demo application sources with Twitter Bootstrap enabled: [link_to_action_demo](https://github.com/denispeplin/link_to_action_demo)

Want to use this gem with [Zurb Foundation](http://foundation.zurb.com/)? Make a
[feature request](https://github.com/denispeplin/link_to_action/issues).

## Why

Rails scaffold-generated links are not DRY, and it becomes even worse,
when someone tries to make them I18n-friendly (they are not by default).

If you have twitter-bootstrap installed, and want to make your links look like
a buttons, there will be another addition, 'class' option. To make these buttons
really pretty, you will also need icons.

So how I18n-friendly button-style link with icon looks like in a view code?
Well, it can look like this:

```erb
<%= link_to raw("<i class=\"icon-edit\"></i> #{t(:edit)}"), edit_comment_path(@comment), class: 'btn' %>
```

And scaffolded code was:

```erb
<%= link_to 'Edit', edit_comment_path(@comment) %>
```

Even in simple scaffolded link words 'edit' and 'comment' was repeated twice.
In the more complex example word 'edit' was written three times.

Using `link_to_action` gem, you can avoid those duplications completely:

```erb
<%= link_to_edit @comment %>
```

That's all for this link, but not all for this gem. It is configurable, it can be
tuned up to suit other than twitter-bootstrap CSS frameworks (which is off by
default anyway), and it even can take advantage of cancan's abilities.

## When

This gem is especially useful when an application contains many similar-looking
links. Many global and link-specific options are exists, so this gem is flexible.
And you still have `link_to` if you want some link to look really simple!

## Installation

Add this line to your application's Gemfile:

    gem 'link_to_action'

And then execute:

    $ bundle

Add initializer, locale file and templates. Note that CSS classes, icons and
cancan are disabled by default. To leave it as it is, just run:

    $ rails generate link_to_action:install

Edit `config/initializers/link_to_action.rb` to change some options. The list of
options with defaults provided below.

To install `link_to_action` with Twitter Bootstrap and icons enabled, run:

    $ rails generate link_to_action:install --bootstrap

## Usage

In general:

    link_to_{action} object, options
    
Per action, with commented-out link_to equivalents (no CSS or icons, just to
keep it simple):

```ruby
link_to_new MyModel # link_to 'New MyModel', new_my_model_path
link_to_index MyModel # link_to 'My Models', my_models_path
link_to_show @my_model # link_to @my_model.name, my_model_path(@my_model)
link_to_edit @my_model # link_to 'Edit MyModel', edit_my_model_path(@my_model)
link_to_destroy @my_model # link_to 'Delete MyModel', my_model_path(@my_model),
# method: :delete, data: { confirm: 'Are you sure?' }
link_to_back # link_to :back
```

`link_to_show` tries some methods (by default :name and :to_s) to get
name for the link. This can be changed by specifying `i18n` option. Other
helpers use I18n to get link names unless `name` option specified.

## I18n

`link_to_action` comes with I18n preconfigured, nested in `helpers.link_to`
section. Custom (or localized) model names can be added to `activerecord.models`
section.

```yml
en:
  activerecord:
    models:
      my_model: 'My Awesome Model'
  helpers:
    link_to:
      new: 'New %{model}'
      show: 'Show %{model}'
      index: 'All %{model}'
      edit: 'Edit %{model}'
      destroy: 'Delete %{model}'
      destroy_confirm: 'Are you sure?'
      back: 'Back'
```

`%{model}` variables are not used by default for `show`, `edit`, and `destroy`.

## Global CSS styles, icons, and other options

Default options are:

```ruby
use_cancan = false # overwrite this to use cancan
use_icons = false # overwrite this to use FontAwesome icons
icons_place_left = true
icons_size = 'large'
icon_new = 'plus'
icon_index = ''
icon_edit = 'edit'
icon_destroy = 'trash'
icon_back = 'undo'
use_classes = false # overwrite this to use Twitter Bootstrap classes
classes_append = false
class_default = 'btn'
class_new = 'btn-primary'
class_index = ''
class_edit = nil
class_destroy = 'btn-danger'
class_back = nil
size_class_default = nil
size_class_large = 'btn-large'
size_class_small = 'btn-small'
size_class_mini = 'btn-mini'
show_methods = [ :name, :to_s ]
destroy_confirm = true
destroy_skip_pjax = false # overwrite this if pjax is used
```
Look to `config/initializers/link_to_action.rb` for detailed descriptions.

## Per-link options

```ruby
:name # overwrites default name of the link
:class # overwrites or appends class list
:size # size of the button-like link
:params # hash for to polymorphic_path, see examples
:icon # Font-Awesome icon
:icon_size # Size of icon
:icon_swap # Swap default position of icon left-right
```

`link_to_destroy` options:
```ruby
:confirm # true/false or some text per-link basis
```

`link_to_show` options:
```ruby
:name # overwrites default name of the link
:send # method to send to object to get name
:raw # method to send to object to get name, output raw
:i18n # if `i18n: true` is set, I18n name is displayed
```

## Examples

```ruby
# Link with parameters
link_to_new Comment, params: {user_id: 1} # /comments/new?user_id=1

# Nested link
link_to_new [ @user, Comment ] # /users/1/comments/new
```

## TODO

1. Better testing.
2. Improve README, add more examples.
3. Add templates for Zurb Foundation.
4. Whitespace fix in templates.

## Credits

This gem was heavily inspired by Platformatec's
[show_for](https://github.com/plataformatec/show_for) and
[simple_form](https://github.com/plataformatec/simple_form) gems. Some code
samples were taken from these gems.

## Thanks

This gem was announced in
[Ruby5 podcast](http://ruby5.envylabs.com/episodes/333-episode-329-december-11th-2012/stories/2906-link_to_action)
and
[A Fresh Cup weblog](http://afreshcup.com/home/2012/12/11/double-shot-1020.html).

## Contributing

1. Fork it
2. Create your feature branch (`git checkout -b my-new-feature`)
3. Commit your changes (`git commit -am 'Added some feature'`)
4. Push to the branch (`git push origin my-new-feature`)
5. Create new Pull Request