Post Tagged ruby

working with webrat + factory girl

Monday, 05 May 2009

Webrat is a nice driver for your integration testing. I have been using it in place of my controller and view specs. Factory Girl is what you should replace your fixtures with. So . . . . When you are using factories in your webrat integration tests, it is sometimes helpful to do things like this:

Given a customer exists with an id of "12345"

and that translates into a step like this:

Factory.factories.each do |name, factory|
  Given /^an? #{name} exists with an? (.*) of "([^"]*)"$/ do |attr, value|
    Factory(name, attr.gsub(' ', '_') => value)
  end
end

And all of this default behaviour is what you get when you install cucumber and factory girl. But today i ran into a little issue. One of my features needed to use the object that was created by Factory Girl in another step, so i caught the factory object with this addition

Factory.factories.each do |name, factory|
  Given /^an? #{name} exists with an? (.*) of "([^"]*)"$/ do |attr, value|
     ######
    @object = Factory(name, attr.gsub(' ', '_') => value)
  end
end

Now i can use @object in my other steps!

That is all.


Dear Bookstore, screw you. kthxby.

Saturday, 04 April 2009

So on Tuesday of last week I revived an old idea.  I  wanted to create a web app that helps college students trade their textbooks.

Let me explain this idea with an example.

As a student. I want to save as much money as possible. I can do this by not buying my books from the university bookstore. But if I do not buy my books from the bookstore, how then shall i get the required reading material? My solution is to BookUp! So, lets say that I just finished Calculus III and I no longer need my 50lb Calculus book. I go to BookUp, find my Calculus book on the list and then I will create a listing associated with the book. This listing will show the world that I no longer need this book and I wish to give it to a student who does. I could sell it for cash or cashews, it does not matter because BookUp does not assume that much. BookUp is more of a tool to connect students and less of an commerce app. So basically this is a Craig’s List for college textbooks.

Let me know what you internet people think about this idea. . . . And now, in case you missed the link

BookUp


skinny controllers in Rails

Thursday, 03 March 2009

Your controller is so fat I took a screenshot of it last Christmas and it is still printing. We have all heard stories about how we should keep our controllers slim and fit but there can never be a definitive answer on how to accomplish the athletic pose. For you see, there are an infinite amount of ways that your controller can take on husk. In this blog-post I will attempt to define and solve one of these problems.

Let us suppose that you have a User model and a Job model.

class User < ActiveRecord::Base
  has_many :jobs
end
 
class Job < ActiveRecord::Base
  belongs_to :user
end

Ok, so this proverbial Job is a very complex model. It has many attributes that are activated by complex algorithms. The job’s algorithms are influenced by input from the user.

class Job < ActiveRecord::Base
  belongs_to :user
 
  def algorithm!( input )
    case input
    when :variation_one
      # do a bunch of crap
    when :variation_two
      # do even more crap
    end# case
  end# algorithm
 
end# Job

Now that we have this model with extremely complicated algorithms that depends on loads of user input; we need to find a RESTful way to call these methods. Please keep in mind that these methods require the users input which will come from the params hash. Since our app is RESTful, we will be ‘updating’ the object by sending a PUT request with data that will be received by the Jobs controller.

Our edit.html.erb should have something like this in it:

 
<%= f.check_box :important_input_that_is_not_apart_of_the_model %>

This data’s purpose is to instruct the algorithm on how to execute. However, it is not apart of the model. There is NO column that corresponds to this data. So the question now becomes: How do i get this data from the view/controller (params hash) to the model?

The way I attack this problem is by adding this to my model:

 
class Job < ActiveRecord::Base
  belongs_to :user
  attr_accessor :important_input_that_is_not_apart_of_the_model
 
  def before_save
    self.algoritm!( self. important_input_that_is_not_apart_of_the_model )
  end
 
  def algorithm!( input )
 
    case input
    when :variation_one
      # do a bunch of crap
    when :variation_two
      # do even more crap
    end
  end# algorithm
end# Job

In this case we have added NO extra code to our update method in the Jobs controller. However we have added heaps of functionality.
Let me know if there is better way to do this ?


Newton’s Method .to_ruby

Sunday, 03 March 2009

here is the math behind Newton’s Method

PRECISION = 0.0001
 
def newtonian_guess( guess,fx,fdx )
  loop do
    better_guess = guess - ( fx.call( guess ).to_f / fdx.call( guess ).to_f )
    return better_guess if ((better_guess - guess).abs <= PRECISION)
    guess = better_guess
  end
end
 
def sqrt( num )
  guess = num/2
  return newtonian_guess( guess,
            lambda {|x| (x**2)-num } ,
            lambda {|x| 2*x } )
end
 
class Float
  def to_sqrt
    sqrt( self )
  end
end
 
p 2.0.to_sqrt
# => 1.41421356237469

ruby is going mobile

Friday, 01 January 2009

An interesting approach to a ruby interpreter on the iPhone .


a new dawn

Tuesday, 01 January 2009

Thanks FLicker for this sunlight + farm photo

 

I will surely harness the power of the sun.

require 'sunlight'
include Sunlight
Sunlight.api_key = "get your own "
 
mois_congress =  Legislator.all_for(:address => "321 W 7th St Kansas City, MO 64105")
s = mois_congress[:senior_senator]
 
p "Why hello Ryan, my name is #{s.firstname + ' ' + s.lastname} !  "
p "Listen, I understand that you are interested in my activities."
p "Just give me a call at #{s.phone} and we can talk things over."

drop this hottness into your local ruby prompt and get ready to program the government.


This sentence is false

Wednesday, 01 January 2009

I stumbled upon some more Ruby goodness. In the restful-authentication plugin, there is a method called logged_in? this method will return current_user which is a method that will return a User object or nil if there is no user logged in.

nil is not false!

val = nil
#=> nil
val.class  
#=> NilClass
!val
#=> true
!!val
#=> false
!!!!!!!!!true
#=> false

Removing Duplicates

Friday, 01 January 2009

Today i was checking in on one of my applications and i had noticed that i forgot to check for unique user entries. This is bad design on my part for several reasons.

  1. When a user submits a form, the submit button should reflect that the request was sent. This can be accomplished by “greying” out the button or by using some AJAZZ progress indication.
  2. It is not that hard to add
validates_uniqueness_of :whatever

nevertheless, I found myself in a position to delete a gaggle of duplicates. Now, the list was certainly manageable but i prefer to let the machines do my work. I sshd’ myself on over to my server and fired up a script/console production. And this is what i did:

#warning! this script can get you fired. 
 
a = People.find(:all)
b = Hash[ *a.map{ |x| [ x[:social_security_number], x] }.flatten ].values
c = a - b
c.each { |x| x.destroy }

What this script does

#1 => grabs all of the people from the database
#2 => loads up all of the people who have the same social
#3 => pull out the duplicates
#4 => makes ActiveRecord calls to remove duplicates from database


it has only been an hour

Thursday, 01 January 2009

and I have discovered many great ideas that will be implemented this year.

With the increasing popularity of dynamic programming languages we are seeing more and more code creep out of the application and into the view of the user. For instance, Mozilla’s Ubiquity is a wonderful new tool to apply a CLI to the web browser. Anyways, i propose:

Great Idea #293

Embed a small and convenient parser into the SMS composer of the iPhone. Why just the other day i was trying to type out the transcript of Steve Balmers infamous speach on software development. It took me nearly 5 minutes, but with a nice Ruby parser i could have done it in 5 seconds. If you would like to see how this would work goto http://tryruby.hobix.com/ and paste the following code.

100.times {puts "Developers!"}

rails picks merb

Tuesday, 12 December 2008

Today the Rails team ate some Merb. Read about it. It is kind of a big deal.