Archive for June, 2011
June 8th, 2011
By default when you `gem install` something you're going to get the RDoc (generated HTML documentation based on the source code) and ri (index for viewing the documentation offline) that comes along with it. You could:
#console
$ gem install terminitor --no-rdoc --no-ri
... if you aren't worried about the documentation. The problem is, of course, remembering to add those command line arguments every time. Fortunately there is an easy solution - like all good Unix utilities `gem` will read `/etc/gemrc` or `~/.gemrc` for default configuration options. The RC files are in YAML format; to globally disable rdoc and ri generation during gem installation for just yourself:
#~/.gemrc
gem: --no-rdoc --no-ri
To understand exactly what you are turning off read: Ruby ri Tool. Honestly since I've just now bothered to read how to use `ri` I will probably leave it on for my workstations and just turn it off for my servers.
For other things you can do in your `.gemrc` file read the documentation.
June 8th, 2011
I assume this patch is going to end up in 1.9.3 but in the mean time: How To Get That Edge Ruby Faster-Loading-Hotness in Ruby 1.9.2 Now
Very easy to do, even for someone fairly new to Ruby, like me. You'll end up having to change your `.rvmrc` file to `rvm use ruby-1.9.2-p180-patched` and do the necessary steps to populate the new gemset (`gem install bundler ; bundle install`).
My guard/rspec/spork/growl went from a 1-2 second delay to pretty much instantaneous when saving a spec or associated controller/model/helper. `bundle exec rake cucumber` also doesn't feel nearly as sluggish.
June 7th, 2011
Assume the following ActiveRecord::Base class:
#./app/models/army_list.rb
class ArmyList < ActiveRecord::Base
belongs_to :game_system
validates :name, :presence => true
validates :points, :numericality => true
validates :game_system, :presence => true
end
I was just pulling my hair out over this spec I was writing to make sure all my validations were working properly:
#./spec/models/army_list_spec.rb
describe ArmyList do
it "should be valid" do
ArmyList.new(:name => "Name", :points => 1500, :game_system => Factory(:game_system)).should be_valid
end
end
Changing it from the constructor method to the block method works however:
#army_list_spec.rb
describe ArmyList do
it "should be valid" do
ArmyList.new do |al|
al.name = "Name"
al.points = 1500
al.game_system = Factory(:game_system)
end
.should be_valid
end
end
Now that I've solved this problem it makes sense. The ActiveRecord::Base documentation for #new states
[...] valid attribute keys are determined by the column names of the associated table – hence you can’t have attributes that aren’t part of the table columns.
Because the column name is actually `game_system_id` it doesn't make sense that I'd be assigning `game_system` - an attribute that doesn't exist on the table - by using this form of the constructor.
June 2nd, 2011
I get this feeling that speccing views in Rails may be pooh-poohed but with this being my first substantive Rails project I wanted to run the full gamut. As I'm using RSpec 2 I discovered that what I thought would be a readily available tag matching assertion is just gone; this is functionality that was available in RSpec 1 but removed due to its rigidness/difficulty to maintain and the fact that Webrat has `have_selector` for performing a similar task.
But I really wanted the simplistic and easily readable `have_tag` syntax so I looked around to see what else was out there. I stumbled across rspec2-rails-view-matchers which was exactly what I was looking for.
I ended up with the following code for testing that one of my show views has the required links for navigation (among other things):
#spec/views/army_lists/show.html.haml_spec.rb
require 'spec_helper'
describe "army_lists/show.html.haml" do
subject do
assign(:army_list,
stub_model(ArmyList,
:name => "Name",
:user => User.new do |u|
u.display_name = "John Smith"
u.id = 1
end,
:game_system => GameSystem.new do |gs|
gs.id = 1
gs.name = "Generic Game System"
end
)
)
render
rendered
end
it { should have_tag("a", :text => "John Smith") }
it { should have_tag("p", :text => /Name/m) }
it { should have_tag("a", :text => /Generic Game System/m) }
end