## Changelog
## v1.2.0
* Enhancements
* Add `required` opt
## v1.1.0
* Enhancements
* Add `non_id_actions` opt
## v1.0
* Bug fixes
* Do not clobber resources in the `Conn` on index action if they are of the same model
## v0.14.2
* Relax Ecto version requirements
## v0.14.1
* Bug fixes
* Use Macro.underscore/1 instead of Mix.Utils.underscore/1 to avoid :mix dependency on production
## v0.14.0
* Enhancements
* You can now tell Canary to search for a resource using a field other than the default `:id` by using the `:id_field` option. Note that the specified field must be able to uniquely identify any resource in the specified table.
* Dependency changes
* Elixir ~> 1.2 is now required
* Ecto ~> 1.1 is now required
## v0.13.1
* Enhancements
* If both an `:unauthorized_handler` and a `:not_found_handler` are specified for `load_and_authorize_resource`, and the request meets the criteria for both, the `:unauthorized_handler` will be called first.
* Bug Fixes
* If more than one handler are specified and the first handler halts the request, the second handler will be skipped.
## v0.13.0
* Enhancements
* Canary can now be configured to call a user-defined function when a resource is not found. The function is specified and used in a similar manner to `:unauthorized_handler`.
* Bug Fixes
* Disabled protocol consolidation in order for tests to work on Elixir 1.2
## v0.12.2
* Deprecations
* Canary now looks for the current action in `conn.assigns.canary_action` rather than `conn.assigns.action` in order to avoid conflicts. The `action` key is deprecated.
## v0.12.0
* Enhancements
* Canary can now be configured to call a user-defined function when authorization fails. Canary will pass the `Plug.Conn` for the request to the given function. The handler should accept a `Plug.Conn` as its only argument, and should return a `Plug.Conn`.
* For example, to have Canary call `Helpers.handle_unauthorized/1`:
```elixir
config :canary, unauthorized_handler: {Helpers, :handle_unauthorized}
```
* You can also specify the `:unauthorized_handler` on an individual basis by specifying the `:unauthorized_handler` `opt` in the plug call like so:
```elixir
plug :load_and_authorize_resource Post, unauthorized_handler: {Helpers, :handle_unauthorized}
```
## v0.11.0
* Enhancements
* Resources can now be loaded on `:new` and `:create` actions, when `persisted: true` is specified in the plug call. This allows parent resources to be loaded when a child is created. For example, if a `Post` resource has multiple `Comment` children, you may want to load the parent `Post` when creating a new `Comment`. You can load the parent `Post` with a separate
```elixir
plug :load_and_authorize_resource, model: Post, id_name: "post_id", persisted: true, only: [:create]
```
This will cause Canary to try to load the corresponding `Post` from the database when creating a `Comment` at the URL `/posts/:post_id/comments`
## v0.10.0
* Bug fix
* Correctly checks `conn.assigns` for pre-existing resource
* Deprecations
* Canary now favours looking for the current action in `conn.assigns.canary_action` rather than `conn.assigns.action` in order to avoid conflicts. The `action` key is deprecated
* Enhancements
* The name of the id in `conn.params` can now be specified with the `id_name` opt