Nathan WilmesNathan Wilmes
Standup 10/7/2008 - Namespaces, class names, and PostGRES
edit Posted by Nathan Wilmes on Tuesday October 07, 2008 at 05:01PM

Ask for Help

When using a namespaced controller, it's hard to get url_for to work with it. Why is that?

  • The controller option for url_for attempts to apply the namespace of whatever controller context it's inside. So if you have an Admin::MyController class, here's what you would need to do for url_fors to this controller:

    • from within an Admin controller class: :controller => "my"

    • from outside an Admin controller class: :controller => "admin/my"

    • for a partial that is used all over the app: :controller => "/admin/my" seems safest
  • Most of us now avoid using url_for-style hashes for our links and URL references. Named routes are a lot more dependable.

  • It is possible to generate a namespaced URL from a model reference, if you are careful.

    • This approach assumes that your controller class names correspond to your model class names.
    • If your model is @model, and your controller is Admin::ModelsController, you can use a helper like the following:

       form_for [:admin, @model] do |f| ... end
      
    • This approach can limit your design, if you rely too heavily on this convention.

Interesting Things

How to read your class's name

While working with the UltraSphinx plugin, Davis and Brandon learned that Class.name didn't always give them the right results. Some of their classes had a class method override what Class.name returned.

Class.class_name came closer, but returns the base class for STI (single table inheritance) classes.

Class.to_s was their most reliable option.

Testing your app on both MySQL and PostGRES

David S. is working on a plugin that allows you to test your environment on multiple databases. Since we're starting to have more projects using PostGRES, we're uncovering situations where some of our common code makes too many assumptions about running on MySQL.

Slutty namespaces

A couple of projects ran into mysterious issues where some of their namespaced controller classes would not load when run from rake.

The culprit was that their namespace module names were the same name as their app models. The lesson - never have a module with the same name as one of your other unrelated classes. (No, I'm not talking about inner classes, which can be fine).

A prime example of this is an Admin::* namespace coexisting with an Admin model. This will cause strange problems depending on what order the classes are loaded. One recommendation is to pluralize your namespaces. In this case, your namespace would be Admins::*.

Another suggestion would be to use an extended noun form for your namespace (Administration::*). Whatever convention you use, stick to it and avoid name collisions.

Nathan WilmesNathan Wilmes
Standup 10/6/2008 - Namespaced controllers and MySQL ordering
edit Posted by Nathan Wilmes on Monday October 06, 2008 at 04:51PM

Ask for Help

David and Jonathan are having trouble with testing namespaced controllers using RSpec. They have two controllers, Admin::MyController and SuperUser::MyController, and the RSpec tests appear to be finding the wrong controller.

Their short-term solution is to put a manual require in the spec that was getting confused.

UPDATE - The issue turns out to be a naming conflict. The app has a model named SuperUser, and the existence of this model can cause class loading to be confused for SuperUser::* controllers. In Socialitis, our standard is to use plural names for controller namespace names, to prevent this sort of confusion.

Interesting Things

Steve has learned that, in general, it's a good idea to avoid using offsets when manipulating large quantities of data in MySQL. Luckily, some of MySQL's quirks help with this:

  • MySQL sorts indexes. The primary key is the main index that it sorts.
  • Any select without an explicit order clause will pick an index, then return data in sorted order by that index. Again, usually you'll see the primary key first.
  • You can take advantage of this behavior to paginate through a large dataset where the order doesn't really matter. The following statements perform better than your typical LIMIT/OFFSET clause:

    SELECT * FROM big_table WHERE id > 1 LIMIT 1000
    SELECT * FROM big_table WHERE id > 1000 LIMIT 1000
    SELECT * FROM big_table WHERE id > 2000 LIMIT 1000
    
  • acts_as_solr uses this technique for reindexing.

  • Also, inserting a record in the middle of an id 'hole' is not a very good idea in MySQL, because the database then puts a great deal of work into reordering all of the later records.

Here's a link to a related blog post: http://weblog.jamisbuck.org/2007/4/6/faking-cursors-in-activerecord

Jeff DeanJeff Dean
New York Standup 10/6/2008: Partial Counters
edit Posted by Jeff Dean on Monday October 06, 2008 at 01:27PM

Interesting Things

  • When using standard rails partials you always have a local variable named _counter. In previous versions of rails, the partial_counter variable was set to 0 when you passed an object, and set to 1 for the first item in a collection. Now it appears to start at 0 whether you pass an object or a collection.

  • Brian Takita has begun work on chaining doubles in RR

Jim KingdonJim Kingdon
New York Standup 10/3/2008
edit Posted by Jim Kingdon on Friday October 03, 2008 at 01:29PM
  • Our site has a number of buttons which are: (a) really links which look like buttons instead of links, (b) ajaxy actions, which typically cause an edit box to appear, or (c) form submissions. This item is especially about (a) and perhaps (b). Right now we have what is a glorified styled a tag, as described here. We've been having trouble getting that to work right (in particular, the height seems off by one pixel in mysterious circumstances). Probably the easiest solution is the rails button_to helper, which makes a form with one button in it (and method=get). This loses some desirable behaviors of the a tag (such as being able to control click or menu-click to open in a new tab), but certainly solves the rendering hassles.

VijayVijay
Standup 10/2/2008: rspec running describes in order
edit Posted by Vijay on Thursday October 02, 2008 at 05:31PM

Interesting Things

  • Rspec - stubbing a class method

In Rspec you can stub a class method in a module using Module::Class:Stubs('method') similar to Mocha syntax stub! does not work for Module::Class:method in rspec

  • Rspec - running test in order

If someone knows of a way to run describes in order in rspec test, please let me know

Ask for Help

"Finder conditions in rails?"

    find(:all, :conditions => 'flag is null')  where flag is boolean

This would work in tests but not in development mode. They tried changing it to

    find(:all, :conditions => 'flag != 1')  where flag is boolean

and this would work in dev mode but not in test.

Try having boolean values in database as not null and never pass null to boolean. Make sure fixtures and development data have similar data sets.

"Selenium tests failing to load associations"

Check if you RAILS_ENV is set to test while running Selenium. There has been some cases of weird rails behavior running tests when RAILS_ENV is set to development

Jim KingdonJim Kingdon
New York Standup 10/2/2008
edit Posted by Jim Kingdon on Thursday October 02, 2008 at 01:35PM
  • Selenium on several machines was failing with Connection Refused errors. This turned out to be caused by IPv6 entries (for example, "::1 localhost") which were added by a recent MacOS upgrade. Commenting out those entries seemed to fix the problem (or work around it, anyway).

  • Some people expressed a style preference, in rspec, for "pending" rather than an empty "it" block, to make it easy to search for pending tests. Excessive pending tests may be an anti-pattern. On the other hand, writing pending tests, at least temporarily, may be a good way to sketch out an area of functionality before it is implemented.

  • We have sometimes found that editing selenium tests (but not other ruby files) in IDEA is incredibly slow (as in, 30 second pauses). Two things to try are removing the gems directory from the project (in favor of just those gems which you need to be able to look at in IDEA), or at least removing the selenium gems. Another such example is that IDEA can be really slow editing the end of a long fixture file. This is probably IDEA 7.0.3 or 7.0.4.

VijayVijay
Standup 10/01/2008: where is the to_date function in ruby/rails world?
edit Posted by Vijay on Wednesday October 01, 2008 at 05:40PM

Interesting Things

  • One of the teams was trying to reopen the Time class to make to_date public. Another pivot noticed that there is no built in to_date in Time class in ruby. ActiveSupport has a to_date method on Time class that is public. The most interesting one is that there is a private to_date that is added to Time class when you include Yaml.

  • We have git brown bag today on how to use git with the Pivotal Process.

Other stuff

  • We are looking for one more unix system administrator preferably with scalability experience to help with our infrastructure. The job description is here. Well there are obvious benefits and then there is also free breakfast :)

Jim KingdonJim Kingdon
New York Standup 10/1/2008
edit Posted by Jim Kingdon on Wednesday October 01, 2008 at 01:29PM
  • There is a ruby meetup tonight at Outside In, at 7pm.

  • For load testing, Load Testing With Log Replay from igvita.com has a review of several common tools.

Other articles: