I did some further digging, and can confirm that the only (?) problem so far lies in the order, in which the params in routes are filled, precisely as Iain writes.
When you have this route definition: map.resources :books, :path_prefix => '/:locale' Routes like `books_path`, `new_book_path`, etc work great, `book_path(1)` etc throw an exception, because the ID (1) gets filled into :locale and the :id is blank. When you call the helper like this: `book_path(I18n.locale, 1)`, everything works fine and you get: '/en-US/books/1' If anyone is interested in this being fixed, and having the option to transparently fill the locale in your routes, please visit the ticket page http://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/1251 and add your +1s and comments. Karel On Oct 22, 11:19 pm, Karel Minarik <[EMAIL PROTECTED]> wrote: > Yes, indeed it behaves precisely like you describe, Iain. (I've tried > on a sample app -- one question, where do you define > `default_url_options`? I did in ApplicationController.) > > Routes like `books_path` or `new_book_path` work perfect, but not any > route with params. > > If this would work, it would be *awesome*, because it's so > transparent... I don't know nothing about routing internals as well, > so we are in the hands of Destiny on this one? :) > > Best!, > > Karel > > Iain Hecker wrote: > > Hi, > > > I'm sorry, I forgot all about it... Let's recap: > > > The problem is that Rails assigns non-hash objects to the first > > variables in the route and only after that the default_url_options get > > assigned. So if you have user_url(1) for routes like > > "/:locale/users/:id" then 1 will be assigned to :locale, and after > > that the default_url_options kick in. They want to set :locale to > > "en-US", but there is no :locale left, so it appends it ?locale=en-US. > > Then it raises a routing error because :id hasn't been filled. > > > If you don't have :locale in front, then this method works really > > nice. You'd get what google uses (foo/bar?hl=en). > > But I want to add the locale in front! (/en/foo/bar) > > > I have been wandering on lighthouse and found this ticket: > >http://rails.lighthouseapp.com/projects/8994/tickets/22-default_url_o... > > > I don't know enough about the routing and url generation to solve > > this, so I made a ticket: > >http://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/12... > > > Iain > > > On Wed, Oct 22, 2008 at 18:51, Karel Minarik <[EMAIL PROTECTED]> wrote: > > > > Hi, > > > > a while ago Iain mentioned the "default_url_options" method in Rails, > > > which could be just what we need for preserving locale in URLs (thus > > > being restafarians! :) > > > > Have you looked into any further, Iain? Has anybody else? It really > > > looks like this would be perfect & transparent solution. > > > > Here are the docs: > > > >http://www.railsbrain.com/api/rails-2.1.0/doc/index.html?a=M000494&na... > > > > Karel > > > >> From: "Iain Hecker" <[EMAIL PROTECTED]> > > >> Date: Oct 3, 3:50 pm > > >> Subject: Am I doing it right? (translating my first app) > > >> To: rails-i18n > > > >> ... > > > >> Rails seems to have an answer to it, called default_url_options[1], > > >> but it doesn't seem to work. I've overwritten the method like the api > > >> tells me, but somehow it is ignored into generating the path. It is > > >> called, because it will break if I raise somthing in it. The options > > >> passed to it are what you'd expect (containing all the parameters > > >> you'd pass to url_for) > > > >> Here's my method: > > > >> def default_url_options(options = {}) > > >> { :locale => I18n.locale } > > >> end --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "rails-i18n" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/rails-i18n?hl=en -~----------~----~----~----~------~----~------~--~---
