Recent notes
RSS feedTo use class attribute with a hash
You can use a setter with merge:
self.settings = settings.merge(key => value)
On destroying data
Reply to tvle83 and pgmcgee: the destructiveness of this method depends on your database. Some databases are better at converting between disparate types than others. For example, when changing a column from a numeric type to a string type, some databases drop the data where others will turn the numbers into their string representations.
Essentially, YMMV.
a misprint?
In section ‘Bi-directional associations’ an example:
d = Dungeon.first
t = d.traps.first
d.level == t.dungeon.level # => true
d.level = 10
d.level == t.dungeon.level # => false
Then use has_many associations, but lower than written ‘for belongs_to associations has_many inverse associations are ignored.’
rest of code is in Object#try
The logic for #try is shared between this method and Object#try – “Show source” here doesn’t show the whole story. Both methods are currently implemented in the file activesupport/lib/active_support/core_ext/object/try.rb .
rest of code is in NilClass#try
If you click “Show source” here, you may get confused. The logic for #try is shared between this method and NilClass#try . Both versions are currently implemented in the file activesupport/lib/active_support/core_ext/object/try.rb .
Long-wanted functional extension
This is pretty nice method allowing you to build stuff in a functional way.
Lets say you want to build a hash from an array, keyed by array object, where each value is the number of same objects in the array.
# imperative style :-P h = Hash.new(0) [1, 3, 2, 3, 1, 3].each { |i| h[i] += 1 } h # => {1=>2, 3=>3, 2=>1} # functional style, using inject. Note that you need to explicitly return the accumulator in the end [1, 3, 2, 3, 1, 3].inject(Hash.new(0)) { |a, i| a[i] += 1; a } # => {1=>2, 3=>3, 2=>1} # using each_with_object. Note the reversed block params - accumulator is the last parameter. # Mnemonic: consistent with each_with_index, where object is the first parameter [1, 3, 2, 3, 1, 3].each_with_object(Hash.new(0)) {|i, a| a[i] += 1} # => {1=>2, 3=>3, 2=>1}
Skipping validation - follow up
For Rails 2.x use #save(false) for Rails 3.x use #save(:validate => false)
Set ids when using a collection of values (cont.)
Regarding schmidt’s post.
The following will not have the expected behavior:
<% Car.each do |c| %> <%= check_box_tag "car_ids[]", c.id, :id => "car_ids_#{c.id}" %> <% end %>
But, if you put the “checked” option to false (or true), it will.
<% Car.each do |c| %> <%= check_box_tag "car_ids[]", c.id, false, :id => "car_ids_#{c.id}" %> <% end %>
Changing the Message
For Change the default message:
Code example
validates :invoice_number, :presence => {:message => 'The invoice number must be informed.'}
Assignment using 'key: value'
Another shorthand way of assigning key, value pairs:
Hash[one: 1, two: 2] #=> {:one=>1, :two=>2}
conditional rescue_from
Would it be possible to do something like:
rescue_from Exception, :with => my_handler, :unless => request.local?
Checking content_for
@tordans You asked your question 3 years ago, but in any case, should anyone have that same issue, you can manage that with:
- unless content_for(:footer).blank? yield(:footer) - else == render "layouts/footer_big"
content_for(:x) defaults to an empty string, that’s why you need to check for blank? not nil?.
this has been deprecated; see linked note
This has been deprecated. See this note on memoize : http://apidock.com/rails/ActiveSupport/Memoizable/memoize#1317-this-has-been-deprecated-replace-with-Memoist
this has been deprecated; replace with Memoist
In Rails 3.2, memoize has been deprecated. In edge Rails, it has been removed.
The commit when it was deprecated: http://github.com/rails/rails/commit/36253916b0b788d6ded56669d37c96ed05c92c5c
A Stack Overflow question about this change: http://stackoverflow.com/q/9132197/578288
I personally disagree with the removal of memoize, and don’t recommend using the `||=` pattern Rails now suggests. The exception is if your entire program only memoizes something once or twice, so it’s not worth including a gem for.
The easiest way to keep using memoize is to use the Memoist gem (http://github.com/matthewrudy/memoist , http://rubygems.org/gems/memoist), which is a simple extraction of ActiveSupport::Memoizable into its own gem.
see also – similar methods
See also DateTime#strftime and Date#strftime . (They work similarly, but have different APIdock notes.)
see also – similar methods
See also Time#strftime and DateTime#strftime . (They work similarly, but have different APIdock notes.)
see also – similar methods
See also Time#strftime and Date#strftime . (They work similarly, but have different APIdock notes.)
Adding Additional Parameters to form_for
If you want to add additional parameters to the form_for helper, but still want to use one form for both your “create” and your “update” actions, you can add the additional parameters to the :url option, but you need to omit the :controller and :action keys.
form_for(@user, :url => {:param1 => "value1", :param2 => "value2"}) do |f|
or
form_for([@post, @comment], :url => {:param1 => "value1", :param2 => "value2"}) do |f|
where param1 and param2 are not :controller or :action
Test if an array is included in another
Array
class Array def included_in? array array.to_set.superset?(self.to_set) end end [1,2,4].included_in?([1,10,2,34,4]) #=> true
Another usage example
given: order active record class with “state” string field
class Order < ActiveRecord::Base def state @state ||= ActiveSupport::StringInquirer.new(read_attribute(:status)) end end order = Order.new(state: "initial") order.state.initial? #=> true order.state.paid? #=> false
add_to_base in Rails 3
In addition to stevo’s note, in Rails 3 you can also do:
model_instance.errors.add(:base, "Msg")
Month-first date string no longer parses correctly
The following date format won’t be parsed correctly:
'06/15/2008'.to_date
Use this instead:
Date.strptime("6/15/2012", '%m/%d/%Y')
Example of usage
e.g.
str = ActiveSupport::StringInquirer.new('test') str.test? # => true str.foobar? # => false
more_than? instance method
Over the weekend I kept running into instances where I was writing code like this:
Code example
arr = ['hello', 'world'] if arr.length > 2 # do stuff else # do something else end
So I ended up extending the core and adding an instance method of more_than?
Code example
class Array def more_than?(num) length > num end end
Usage
arr = ['hello', 'world'] puts "Hello" if arr.more_than? 1
:disable_with is deprecated
Or you can use this way:
<%= submit_tag "Login", data: { disable_with: "Please wait.." } %>
:disable_with is deprecated
Since version 3.2.5 you should not use :disable_with.
Use this:
<%= submit_tag "Login", 'data-disable-with' => "Please wait.." %>
This method does not work.
It’s an old problem, reported back in 2010, just reopened issue: