As much as i wish to upgrade my Rails 2.3.x application Daily Fratze to the newest tag of the Rails 2.3.x branch, i cannot.
First there was the epic fail of release 2.3.6, that broke all HTML Helpers and forced the Rails XSS protection upon us. This release was immediately followed by 2.3.7 and 2.3.8. With my tests, this version was still enforcing Rails XSS and breaking helpers like “h”.
Rails 2.3.9, released last week, puts en end to this.
I just was about to upgrade, when i read this error: Textarea input silently truncated in 2.3.8!. The input of a textarea is truncated if the text entered consists of two lines or more with one of them quoted as the Rack middleware messes with the input.
I can confirm that this behavior still applies to 2.3.9.
It’s a shame, that all the talk is about Rails 3 with bugs like this in an older branch. I understand that this is a Rack problem but as it is already fixed in newer Rack versions, i cannot understand that the Rails team doesn’t bump the required Rack version respectively has no tests for problems like these.
So i’m hoping that Rails 2.3.10 sees the light of day anytime soon.
Anyway, as Rails 2.3.9 suddenly uses a new interpolation syntax for the translation files (“Hello {{name}}” becomes ” Hello %{name}”), here is a one-liner to update i18n files to the new syntax:
find . -iname "*.yml" -exec sed 's/{{\([^\{\}]*\)}}/%{\1}/g' -i {} \;
If you like some less escapism use xargs
find . -iname "*.yml" | xargs sed 's/{{\([^{}]*\)}}/%{\1}/g' -i;
Commands need to be executed inside your locale directory.
Share This
I found no other way to change the path of “images” in a Rails application than monkey patching the AssetTagHelper like so:
module ActionView
module Helpers #:nodoc:
module AssetTagHelper
def image_path(source)
compute_public_path(source, 'static_images')
end
alias_method :path_to_image, :image_path # aliased to avoid conflicts with an image_path named route
end
end
end
Share This
The default behavior for quite a long time was :hard_breaks in the textilize helper method in rails.
Hard Breaks means: All line breaks are turned into <br />’s.
Somebody changed the textilize helper in “actionpack-2.3.4/lib/action_view/helpers/text_helper.rb” in 2.3.4 and added the ability to pass some options but broke the default behavior here:
def textilize(text, *options)
options ||= [:hard_breaks]
# ...
Options will never be null.
I fixed this by monkey patching the module through the following code in config/initializers/textilizepatch.rb
module ActionView
module Helpers
module TextHelper
def textilize(text, *options)
options = [:hard_breaks] if options == nil || options.size == 0
if text.blank?
""
else
textilized = RedCloth.new(text, options)
textilized.to_html
end
end
end
end
end
Such changes should be tested… *grml*
Share This
You can use
RAILS_DEFAULT_LOGGER.log "foobar"
# or
Rails.logger.log "blah"
outside a controller for logging.
Share This
The last Passenger update brought some good explanation off the problems regarding Passenger and memcache-client (see here).
Smart spawning of Passenger processes creates shared file descriptors. As the connections to memcached are sockets they are shared as well so data on them gets corrupted which is explained very nicely in the Passenger documentation: Example 1: Memcached connection sharing (harmful).
The solution presented there works like a charm. The reestablish_connection_to_memcached line is actually not more than CACHE.reset where CACHE is the reference to the memcache connection.
After that change, spawning methods smart-lv2 and smart will work in connection with environment.rb configured memcache connections.
Edit: As requested in the comments, a little example:
memcache_options = {
:c_threshold => 10000,
:compression => true,
:debug => false,
:namespace => 'some_ns',
:readonly => false,
:urlencode => false
}
CACHE = MemCache.new memcache_options
CACHE.servers = '127.0.0.1:11211'
begin
PhusionPassenger.on_event(:starting_worker_process) do |forked|
if forked
# We're in smart spawning mode, so...
# Close duplicated memcached connections - they will open themselves
CACHE.reset
end
end
# In case you're not running under Passenger (i.e. devmode with mongrel)
rescue NameError => error
end
In this case, CACHE is the global constant that i use to access my memcache-client.
I guess you’ll need to do the same with the global Rails.cache object, but i’m not sure. Anyway, the above solution works for me.
Share This