Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
38 lines (36 sloc) 4.34 KB
* Store sessions in the database.
* Use a custom configuration file for passwords and API keys instead of storing them in your Subversion repository. I use YAML and mirror the style of database.yml.
* Use constants where needed. Instead of repeating strings like the address of your customer service reply email, set it once in a constant (in environment.rb or the appropriate environment file) and use that throughout your application.
* Keep time in UTC. A no brainer, and easy to do.
* Don't loop through ActiveRecord models inside other models. Use eager loading if you need to work with multiple associated models. Better yet, write a custom SQL query and let the database do the work for you.
* Beware of binary fields. By default, all fields are returned with queries, including the full contents of any binary fields. Use :select to pull out only the fields you need.
* Write tables to cache data for reports that span months and years. It.s much faster than re-generating a year.s worth of reports every time a page is loaded.
* Create a table with a list of country names. By default, Rails uses strings for selects and lists of countries, which doesn.t work well for reporting or database consistency between models.
* Avoid bloated controllers. Instead of piling actions into a controller, limit yourself to 10 actions per controller, then rethink your design.
* Keep your controllers and views skinny. In general, most of your code should be in your models, not your controllers or views.
* Don't store objects in the session. Use integers or short strings if necessary, then pull the appropriate object out of the database for the duration of a single request.
* Avoid heavy response processing. Can you mark a record as needing to be processed, then use a cron job or a messaging server to do the long-running work? BackgroundRB is also an option. (I use this technique for filtering SPAM comments on this blog).
* Use ar_mailer to queue bulk emails instead of sending them during the Rails response cycle.
* Monitor your servers with the exception_notification plugin, munin, monit, or other tools.
* Don't cut costs on hardware. You.ll quickly lose the money you thought you were saving if your developers have to spend even one day a month on unexpected server maintenance due to poor backups or cheap hardware.
* Test-drive your development.
* Use database indexes to speed up queries. Rails only indexes primary keys, so you.ll have to find the spots that need more attention.
* Profile your code. The ruby-prof gem and plugin helped me make an application three times faster with only minimal changes to the code.
* Minimize graphic-related dependencies. If your application only needs to make a few thumbnails, don.t waste memory by importing large graphics libraries. Look at mini-magick or image_science for lightweight thumbnailing.
* Avoid excessive repeated rendering of small partials.
* Use CSS instead of inline tags to apply selective styling.
* Don't use ActiveRecord.s serialize option to store large objects in database fields.
* Use attr_protected :fieldname in models to keep database fields from being manipulated from forms (or from any calls to Model.update_attributes(params[:model])).
* Use Ruby classes and inheritance to refactor repeated controller code.
* Use unobtrusive Javascripting techniques to separate behavior from markup.
* Package self-sufficient classes and modules as plugins or RubyGems.
* Cache frequently accessed data and rendered content where possible.
* Write custom Test::Unit assertions or rSpec matchers to help with debugging test suite errors.
* Rotate the Rails and Mongrel logfiles using the logrotate daemon on Linux.
* Build a reliable backup system.
* Automate deployment and maintenance with Capistrano or Vlad.
* Keep method bodies short. If a method is more than 10 lines long, it.s time to break it down and refactor.
* Run flog to determine overly complex methods and clases.
* Don't use too many conditionals. Take advantage of case statements and Ruby objects to filter instead of multiply-nested if statements.
* Don't be too clever. Ruby has great metaprogramming features, but they are easy to overuse (such as eval and method_missing).
* Become familiar with the most popular plugins. Instead of re-implementing the wheel, save yourself some time by using well tested, popular plugins.