Recent notes
RSS feedWas removed to a plugin in v 2.0
Is now the auto_complete plugin here:
bug?
beware, update_all silently ignores :limit and :order option in 3.0.8.
I’ve fixed my code temporarily with
update_all "foo=1 where #{myscope.where_values} limit 1"
Set ids when using a collection of values
The trick to getting the helper to populate a unique HTML ID and for rails to recognise a collection is to give the helper a unique ‘name’ and to set the :name symbol to parameter with an array symbol ‘[]’.
<% Cars.each do |c| %> <%= check_box_tag "car_ids[#{c.id}]", c.id, :name => "car_ids[]" %> <% end %>
Generalized Zip
My 5 cents.
I find trully useful this. Is a kind of generalized zip. You can combine 2 or more enumerables (arrays or others) of any size into a hash, array of arrays, .… The size of the result is the size of the bigest of the enumerables. For the shortests enumerables nil elements are used at the end.
# method compose def compose(*enumerables) res=[] enumerables.map(&:size).max.times do tupla=[] for enumerable in enumerables tupla << enumerable.shift end res << (block_given? ? yield(tupla) : tupla) end res end
some examples:
en1= [1, 2, 3, 4] en2= ['a', 'b', 'c', 'd', 'e'] en3= {:elem1 => "1", :elem2 => "2", :elem3 => "3"} p compose en1.dup, en2.dup, en3.dup p a1=compose(en2.dup, en1.dup) {|a,b| {a.to_sym => b}} p a1.inject({}) {|ac,item| ac.merge item} p a1.flatten p a2=compose(en2.dup, en1.dup).flatten p Hash[*a2] p a3=compose(en2.dup, en3.dup).flatten
Their outputs are:
#[[1, "a", [:elem1, "1"]], [2, "b", [:elem2, "2"]], [3, "c", [:elem3, "3"]], [4, "d", nil], [nil, "e", nil]] #[{:a=>1}, {:b=>2}, {:c=>3}, {:d=>4}, {:e=>nil}] #{:b=>2, :d=>4, :e=>nil, :c=>3, :a=>1} #[{:a=>1}, {:b=>2}, {:c=>3}, {:d=>4}, {:e=>nil}] #["a", 1, "b", 2, "c", 3, "d", 4, "e", nil] #{"a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>nil} #["a", :elem1, "1", "b", :elem2, "2", "c", :elem3, "3", "d", nil, "e", nil]
Typo in matches? example
Iphone example should be def self.matches?(request)
finding without default scopes in rails 3
if you want to find without default scopes in rails 3 and with_exclusive_scope is giving you protected method errors in controllers, use unscoped for a similar purpose
Catching rollback and re-raise exception
In response to wiseleyb, I don’t believe that you could put “rescue” in a transaction block, let alone catching ActiveRecord::Rollback. It would lead you to an “unexpected kRESCUE” error.
I think this is more appropriate.
def start_transaction Company.transaction do # don't forget the bang to make sure it raise # exception or the transaction won't rollback user.save! company.save! x=1/0 return true end # re-raise exception here raise "Exception!" end
Then you could call the method in another place, and it would raise rollback and other exception.
... # would return the "Exception!" if rollback occurs # it would also still trigger another exception other # than rollback. start_transaction ...
Don't Use to_formatted_s(:db) on an Array of IDs
I thought using to_formatted_s(:db) on an array of ids would separate them with commas in a nice way. Wrong. It does, but it also changes the numbers.
Wrong
[60, 271, 280, 283].to_formatted_s(:db) # => "121,543,561,567" # Completely different numbers!
Instead, use the join method:
Right
[60, 271, 280, 283].join(",") # => "60,271,280,283" # Much better
I think this has to do with (:db) being used for formatting dates but I’m not sure.
must be first
A little gotcha I ran into.
This must be defined before you define your relationships.
ie:
class Ticket < ActiveRecord::Base set_table_name 'ticket' belongs_to :customer has_one :account, :through => :customer end
if you do the relationships first it will not use the correct table name on the lookups.
Change to the way the block is handled
At least in 3.0.5, some of the previous examples no longer work: ActionView seems to quietly ignore Array content.
If you were using code of the form
content_tag(:li, nil, :class => 'someClass') { arr.collect { |x| content_tag(:ul, x) } }
it now needs to look like
content_tag(:li, nil, :class => 'someClass') { arr.reduce('') { |c, x| c << content_tag(:ul, x) }.html_safe }
relative_url_root= no longer exists in Rails 3.0
Rails 3.0 does this with scope in config/routes.rb
scope "/exampleapp" do resources :examples root :to => "examples#index" end
Asserting Emails
–setup_mailer.rb in config/initializers –rails g mailer MailerName –methods in mailer_name.rb –files in views/mailer_name –MailerName.method(@object).deliver in object controller
Using New
-rails new ProjectName -switch directories -git repo “git init”, then commit -add gems, bundle install -rails g scaffold TableName attribute:type attribute:type….. -authentication -add attribute_accessible/relationships/validations -get rid of index.html in public, set root “table#index” -rails g nifty:layout -rake db:migrate -git repo -rails s, see if works -change id’s to names in show and indexes -images go to public/images -partials are rendered in application.html.erb
Backport from 1.9
Below is a backport of the Ruby 1.9 implementation (minus some encoding stuff). The main thing this provides you is the ability to say :foo => [‘bar’, ‘baz’] and have that turn into foo=bar&foo=baz (i.e. multiple values for the same key).
Just require into your project and use it like you are on 1.9.
module Net module HTTPHeader def set_form_data(params, sep = '&') query = URI.encode_www_form(params) query.gsub!(/&/, sep) if sep != '&' self.body = query self.content_type = 'application/x-www-form-urlencoded' end alias form_data= set_form_data end end module URI def self.encode_www_form(enum) enum.map do |k,v| if v.nil? k elsif v.respond_to?(:to_ary) v.to_ary.map do |w| str = k.dup unless w.nil? str << '=' str << w end end.join('&') else str = k.dup str << '=' str << v end end.join('&') end end
Input strings are treated as regexp
Input strings are treated as regexp, but you can escape special regexp characters as usual:
"*test*".should match "\\*test\\*" #=> pass "*test*".should match '\*test\*' #=> pass "*test*".should match /\*test\*/ #=> pass
Remove non empty directories
To remove a non empty directory use FileUtils:
Dir.mkdir("test_dir") Dir.mkdir("test_dir/sub_dir") FileUtils.remove_dir("test_dir",true)
Eql equals ==
Use eql to compare values as you would use ==:
"test".should eql "test" #=> pass "test".should == "test" #=> pass
Do not confuse with equal which compares objects.
Test strings with eql
Equal fails when comparing two different string objects:
"test".should equal "test" #=> fail "test".should match "test" #=> pass "test".should eql "test" #=> pass
In fact:
"test".object_id.should_not eql "test".object_id #=> pass
Match fails when the string contains regex special characters not escaped:
"*test*".should match "*test*" #=> fail for invalid regex "*test*".should eql "*test*" #=> pass
In fact, match treats input as regexp:
"*test*".should match /\*test\*/ #=> pass
Why gsub!
I notice other adapters use sql.sub!, not sql.gsub! and in fact I had trouble with adding the limit parameter to any query involving nested selects. Replacing sql.gsub! with sql.sub! solved that problem for me. Has anyone else had a similar experience with this method?
In other words, replace:
sql.gsub!(/SELECT/i, 'SELECT B.* FROM (SELECT A.*, row_number() over () AS internal$rownum FROM (SELECT')
With:
sql.sub!(/SELECT/i, 'SELECT B.* FROM (SELECT A.*, row_number() over () AS internal$rownum FROM (SELECT')
logging before filters
If you need to track and log which before filters are called for the purpose of debugging your app/before_filters. Then here’s a suggestion, how this could be accomplished:
customizing text when using label in a form
Instead of the default text Email you can change it to “Primary Email” like this: f.label :email, “Primary Email”
the source is wrong!
in 3.0.5, the source code in line 15 looks like this:
respond_to?(:"#{k}=") ? send(:"#{k}=", v) : raise(UnknownAttributeError, "unknown attribute: #{k}")
whats wrong with apidock?
Working with match captures
Let’s say you wanted to filter out passwords from:
s = "password=bob&password=jim&password=jane"
You’d do this:
r = /password\=([^\&]+)/ s.gsub!(r) { |m| m.gsub!($1, "[FILTERED]") }
Which would return
password=[FILTERED]&password=[FILTERED]&password=[FILTERED]
Moved to ActiveRecord::Persistence
This isn’t deprecated, it was just moved in Rails 3. See:
reload is deprecated? what's the new alternative?
What’s the recommended alternative to reload for more recent versions of Rails?
After filters are not called when exception occurs
Please note after filters are not executed when an exception occurs. You have to handle these situations explicitly.