Repository is archived
No commit activity in last 3 years
No release in over 3 years
Find records for Rails controller actions declaratively.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies
 Project Readme

Declarative Find

This Rails plugin makes a find method available at the class level in ApplicationController which takes the name of an ActiveRecord model. Using this method creates a before filter which finds an ActiveRecord instance and assigns it to an appropriately named instance variable in the controller. The name of the model passed to find is used for both the key in params assumed to contain the ID of the record to find as well as the name of the instance variable to assign it to. This behavior can be customized any which way via options. An 404 HTTP code will be returned and the corresponding error page rendered for non-existent records via the http-error gem.

Full documentation is at RubyDoc.info.

Examples

Straight-forward

The following example assumes the request for the delete action has an :id or :user param passed to it with the ID of the user to delete.

class UserController < ApplicationController
  find(:user)

  def delete
    @user.destroy
  end
end

Different parameter name

The following example assumes the request for the delete action has a :user_id param passed to it with the ID of the user to delete.

class UserController < ApplicationController
  find(:user, :param => :user_id)

  def delete
    @user.destroy
  end
end

Different instance variable name

class UserController < ApplicationController
  find(:user, :variable => :user_to_delete)

  def delete
    @user_to_delete.destroy
  end
end

Custom lookup

class UserController < ApplicationController
  find(:user)

  def delete
    @user.destroy
  end

  protected

  def find_user
    User.find_by_email(params[:email])
  end
end

Pass-through of options

The find can be restricted to specific actions the same way a typical before filter can be—in fact, any options passed to find are simply passed through to before_filter.

class UserController < ApplicationController
  find(:user, :only => :delete)

  def delete
    @user.destroy
  end

  def something_else
    render(:text => 'Something else.')
  end
end

Colophon

See also

If you like this gem, you may also want to check out Create New, Save Changes To, or HTTP Error.

Tested with

  • Rails 3.0.5 — 20 May 2011

Contributing

To send patches, please fork on GitHub and submit a pull request.

Credits

© 2011 Cody Robbins. See LICENSE for details.