Ruby on Rails
collect {|item|block}
and map{|item|block}
do the same thing – return an array of things returned by the block. This is different from returning specific items in the collection being iterated over.
Which leads to select
.
select{|item|block}
will return actual collection items being iterated over if, for each item, the block condition evaluates to true
. Not the same as returning what the block, itself, may return. In the case of select, the block would always return an instance of class TrueClass
or FalseClass
. Typically, [true, false, ..., true]
is not what you’re looking for in your resulting array.
Slightly modifying the core RDoc example:
a = ["a", "b", "c", "d"]Â Â Â Â #=> ["a", "b", "c", "d"]
a.map {|item|"a" == item}Â Â Â #=> [true, false, false, false]
a.select {|item|"a" == item}Â #=> ["a"]
If you’re trying to run the rake task required for installing Cucumber in Rails and keep getting the following error message:
rake aborted!
undefined method `select’ for class `ActiveRecord::ConnectionAdapters::MysqlAdapter’
Check to see whether you’re using the query_analyzer plugin. I had to uninstall it to get the rake task to complete using:
script/plugin remove query_analyzer
That solved the problem
Assuming you want to make sure that no two models have the same COMBINATION of values for a and b:
so having two models with:
a = 1, b = 2
a = 1, b = 3
would not be a conflict.
If that’s the case then the standard validation
class Widget < ActiveRecord::Base
validates_uniqueness_of :a, :b
end
wouldn’t work since it tries to prevent saving two models with the same value of a, OR with the same value of b.
And even if that’s not what you’re trying to do, and you’re ok with the example being a conflict, validates_uniqueness_of doesn’t guarantee uniqueness if two users try to save conflicting records simultaneously. Â The validation works by first trying to find a record with the value, and if it doesn’t find it inserting the ‘new’ record, and this can fail due to a concurrency hole.
To fill this hole requires leaning on the database server, and the way to do that in SQL is by having a unique index on the table which covers the column or columns you want to be unique. This assume you are using a database which supports it, e.g. MySql.
To create an index you can create a migration which includes a statement like
add_index  :widgets, [:a, :b], :unique => true)
Assuming that the table name for the model is ‘widgets’
Now if you do this, you also need to be aware that if you try to save a record with a uniqueness conflict the save will raise an ActiveRecord::StatementInvalid exception, which you’ll need to rescue and do something like telling the user of the conflict so that he can rectify it.
After downloading the latest Ubuntu desktop appliance from VMware, the following steps are required to get a Rails environment up and running:
Create a new user and add all the required access
Get Ubuntu up to date
sudo apt-get update sudo apt-get dist-upgrade
Install compile packages
sudo apt-get install build-essential
Install Ruby, MySQL and the Open SSL library
sudo apt-get install ruby ri rdoc mysql-server libmysqlclient15-dev libopenssl-ruby ruby1.8-dev
Install Sun Java
sudo apt-get install sun-java6-jre sun-java6-plugin
Get the latest ruby gems from RubyForge
wget http://rubyforge.org/frs/download.php/57643/rubygems-1.3.5.tgz tar xvzf rubygems-1.3.5.tgz cd rubygems-1.3.5 sudo ruby setup.rb
Remove the .tgz file and erase the rubygems-1.3.5 directory too.
Create the following symbolic links
sudo ln -s /usr/bin/gem1.8 /usr/local/bin/gem sudo ln -s /usr/bin/ruby1.8 /usr/local/bin/ruby sudo ln -s /usr/bin/rdoc1.8 /usr/local/bin/rdoc sudo ln -s /usr/bin/ri1.8 /usr/local/bin/ri sudo ln -s /usr/bin/irb1.8 /usr/local/bin/irb
Install Rails
sudo gem install rails
Add Github for legacy gems
gem sources -a http://gems.github.com
Switch to Gemcutter for primary gem repository
sudo gem install gemcutter gem tumble
I use the Rails console mainly to poke around in my database. Unfortunately the display of the records returned leaves a lot to be desired. Hirb solves this problem perfectly! Here are the quick steps you need to get the basic functionaliy:
- Install the gem: sudo gem install cldwalker-hirb –source http://gems.github.com
- Start the console: ruby script/console
- Require Hirb: require ‘hirb’
- Enable it: Hirb.enable
- Try it: x = Model.find(:all)
WebDesignerWall has a great introductory jQuery tutorial. There are ten tutorials, including ones on animated hover effects, collapsible panels and menu accordions.
I was using the Rails helper observe_field to monitor a text entry form on my web app. I couldn’t figure out why the relevant method was not being called until I realized that it was happening every time there was a single quote in the text entry. The solution is simple. Use the escape_javascript function as shown below:
[ruby]
<%= observe_field :guess,
:frequency => 0.5,
:update => 'ajaxWrapper',
:url => {:action => 'feedback', :only_path => false},
:with => "'correct=#{escape_javascript(@text)}&guess='+encodeURIComponent(value)" %>
[/ruby]
ssh-keygen -t rsa
Then use this command to push the key to the remote server, modifying it to match your server name.
cat ~/.ssh/id_rsa.pub | ssh [email protected] 'cat >> .ssh/authorized_keys'