Problemilla con localización (URLs)


#1

Hola amigos,

Estoy tratando de localizar una aplicación muy sencillita. Es la primera
vez
que me lanzo al tema de la localización con el i18n de Rails 2.2.

He localizado fechas sín problema.

He localizado los textos del interface sin problemas.

El problema me llega con las URLs. He seguido las instrucciones de la
documentación en:

http://guides.rails.info/i18n.html

Hee puesto en application.rb:

def default_url_options(options={})
logger.debug “default_url_options is passed options:
#{options.inspect}\n”
{ :locale => I18n.locale }
end

Me fuciona perfectamente, según pone. Es decir a partir de aquí, las
URLs de
los links ya incluyen (/users?locale=es y /users?locale=en).

Pero cómo yo lo que quiero son rutas tipo (/es/users y /en/users), he
puesto
lo que en el tutorial pone que hay que añadir a routes.rb:

map.connect ‘:controller/:action/:id’
map.connect ‘:controller/:action/:id.:format’

map.resources :users, :path_prefix => ‘/:locale’
map.resources :posts, :path_prefix => ‘/:locale’
map.resources :page, :path_prefix => ‘/:locale’

config/routes.rb

map.root :controller => “page”, :path_prefix => ‘/:locale’

Reinicio el servidor y no me funciona, cuando pincho el enlace de
“posts”
apunta a (/es/users) pero me lanza:

post_url failed to generate from {:action=>“show”, :controller=>“posts”,
:locale=>#<Post id: 1, title: “My first post3”,…

¿Alguien me puede decir que estoy hacendo mal?
Muchas gracia


#2

map.connect ‘:controller/:action/:id’
map.connect ‘:controller/:action/:id.:format’

map.resources :users, :path_prefix => ‘/:locale’
map.resources :posts, :path_prefix => ‘/:locale’
map.resources :page, :path_prefix => ‘/:locale’

A parte de otros errores que yo no veo, te aconsejo que pongas las tres
ultimas antes en el archivo. rails pilla las rutas por el orden en el
que
esten en routes.rb

El 20 de febrero de 2009 18:48, Fernando removed_email_address@domain.invalid escribió:


#3

No se si te he entendido bien Andrés, lo he dejado así:
ActionController::Routing::Routes.draw do |map|
map.resources :users, :path_prefix => ‘/:locale’
map.resources :posts, :path_prefix => ‘/:locale’
map.resources :page, :path_prefix => ‘/:locale’

map.connect ‘:controller/:action/:id’
map.connect ‘:controller/:action/:id.:format’
map.root :controller => “page”, :path_prefix => ‘/:locale’
end

Y me sigue fallando.
Os paso más info de la página de error:

ActionController::RoutingError in Posts#index Action Controller:
Exception
caught

Action Controller: Exception caught

post_url failed to generate from {:action=>“show”,
:controller=>“posts”, :locale=>#<Post id: 2, title: “My second post”,
body: “Ths is my second post too…”, created_at: “2009-02-11
22:16:53”, updated_at: “2009-02-11 22:16:53”>}, expected:
{:controller=>“posts”, :action=>“show”}, diff: {:locale=>#<Post id: 2,
title: “My second post”, body: “Ths is my second post too…”,
created_at: “2009-02-11 22:16:53”, updated_at: “2009-02-11 22:16:53”>}

13:

<%=h post.body %> 14: <%=h short_date(post.created_at)
%> 15: 16: <%= link_to t(“view”), post %> 17: <% if
autenticado %> 18: <%= link_to t(“edit”), edit_post_path(post)
%>
19: <%= link_to t(“destroy”), post, :confirm => t(“are_you_sure”),
:method => :delete %>

El 20 de febrero de 2009 18:55, Andrés gutiérrez
removed_email_address@domain.invalid
escribió:

map.connect ‘:controller/:action/:id’
map.connect ‘:controller/:action/:id.:format’

map.resources :users, :path_prefix => ‘/:locale’
map.resources :posts, :path_prefix => ‘/:locale’
map.resources :page, :path_prefix => ‘/:locale’

A parte de otros errores que yo no veo, te aconsejo que pongas las tres
ultimas antes en el archivo. rails pilla las rutas por el orden en el
que
esten en routes.rb

El 20 de febrero de 2009 18:48, Fernando removed_email_address@domain.invalid escribió:

Hola amigos,

Estoy tratando de localizar una aplicación muy sencillita. Es la primera
vez que me lanzo al tema de la localización con el i18n de Rails 2.2.

He localizado fechas sín problema.

He localizado los textos del interface sin problemas.

El problema me llega con las URLs. He seguido las instrucciones de la
documentación en:

http://guides.rails.info/i18n.html

Hee puesto en application.rb:

def default_url_options(options={})
logger.debug “default_url_options is passed options:
#{options.inspect}\n”

{ :locale => I18n.locale }
end

Me fuciona perfectamente, según pone. Es decir a partir de aquí, las URLs
de los links ya incluyen (/users?locale=es y /users?locale=en).

Pero cómo yo lo que quiero son rutas tipo (/es/users y /en/users), he
puesto lo que en el tutorial pone que hay que añadir a routes.rb:

Reinicio el servidor y no me funciona, cuando pincho el enlace de “posts”
apunta a (/es/users) pero me lanza:

post_url failed to generate from {:action=>“show”, :controller=>“posts”,
:locale=>#<Post id: 1, title: “My first post3”,…


#4

cuando pincho el enlace de “posts” apunta a (/es/users)

¿Por que te manda a users? ¿no debería de mandarte a post? A menos que
post
sea un recurso anidado de user.

Pon el codigo que tengas en routes.rb por favor

El 20 de febrero de 2009 21:26, Fernando removed_email_address@domain.invalid escribió:


#5

Perdona Andrés, ya lo puse en el anterior mail:
ActionController::Routing::Routes.draw do |map|
map.resources :users, :path_prefix => ‘/:locale’
map.resources :posts, :path_prefix => ‘/:locale’
map.resources :page, :path_prefix => ‘/:locale’

map.connect ‘:controller/:action/:id’
map.connect ‘:controller/:action/:id.:format’
map.root :controller => “page”, :path_prefix => ‘/:locale’
end

Y si no me equivoco me manda a :posts, no a :users
¿?

Gracias de todos modos por tu interés…

El 20 de febrero de 2009 22:40, Andrés gutiérrez
removed_email_address@domain.invalidescribió:


#6

Perdona Andrés, ya lo puse en el anterior mail:
Perdoname a mi, soy un poco corto :-()

Pero,…lo de:

Y si no me equivoco me manda a :posts, no a :users

No lo entiendo, ¿no dices que la URL es (/es/users). Así te esta
mandando a
USERS ¿no?

cuando pincho el enlace de “posts” apunta a (/es/users) pero me lanza:
¿el enlace es: post_url?

El 20 de febrero de 2009 22:49, Fernando removed_email_address@domain.invalid escribió:


#7

huy, perdona, te he liado poniendo ese ejemplo de URL. He puesto esa
cómo
ejemplo y luego cómo ejemplo de pantalla de error te he puesto la que me
lanza al pinchar el enlace de :posts… :frowning:

Bien, para dejarlo claro:
La url que me pinta el link es (/es/posts) y es de tipo link_to,
concretamente

<%= link_to t(“view”), post %>, que ademas si lo
quito, la página renderiza sin problemas.

El 20 de febrero de 2009 22:59, Andrés gutiérrez
removed_email_address@domain.invalidescribió:


#8

haz en consola un rake routes a ver que te da

El 20 de febrero de 2009 23:38, Fernando removed_email_address@domain.invalid escribió:


#9

Aqui una larga discusión sobre el tema:

http://rails.lighthouseapp.com/projects/8994/tickets/1251-default_url_options-cant-be-used-with-named-routes

Saludos.

P.D: estoy con sueño como para aportar algo mas :frowning:


#10

Me he mirado un poco por encima la discusión que me ha apuntado Ruben,
pero
me lo tomaré con tiempo para repasarlo ya que supera un poquito mi nivel
de
inglés. Pero parece que al menos hay más gent con el mismo problema.
Gracias
Rubén.

Andrés, ahora mismo hago el raje routes, a ver que me da… te cuento…

El 21 de febrero de 2009 10:39, Andrés gutiérrez
removed_email_address@domain.invalidescribió:


#11

Sorpresa, me lanza esto:
Missing the Rails 2.1.0 gem. Please gem install -v=2.1.0 rails, update
your RAILS_GEM_VERSION setting in config/environment.rb for the Rails
version you do have installed, or comment out RAILS_GEM_VERSION to use
the
latest version installed.

Todavía me pierdo un poco con la consola y la instalación de gemas y
todo
eso. Pero creí que tenía instalada la versión 2.2 de Rails.
La última actualización la realicé desde el CMD de windows y pareci´ço
quedar tod ok. Quizas lo que ocurre es que cómo los archivos los edito
desde
Aptana Radrails, este ha creado su instalación paralela de Rails (más
antigua) y cuando arracon el server desde Aptana, estoy corriendo la
aplicación sobre esa versión.

¿Puede ser esto lo que me está ocurriendo?
Voy a probar a arrancar el webrick directamente desde la consola cmd y
ver
que pasa.
Ahora te cuento…

El 21 de febrero de 2009 11:41, Fernando removed_email_address@domain.invalid escribió:


#12

La url que me pinta el link es (/es/posts) y es de tipo link_to,
concretamente

<%= link_to t(“view”), post %>, que ademas si lo
quito, la página renderiza sin problemas.
Prueba a cambiar la linea que tu tienes por esto:
<%= link_to 'view', post %>

El 20 de febrero de 2009 23:38, Fernando removed_email_address@domain.invalid escribió:


#13

Pues acabo de probar y nada, me sigue dando el mismo error. Incluso he
probado a reiniciar el server (aunque creo que no es mientras no toque
routes.rb).
Además si me hubiera funcionado, no me pillaría el texto localizado.
En fín me repasaré el hilo que me ha apuntado Ruben… muchas gracias de
todos modos.

El 21 de febrero de 2009 18:03, Andrés gutiérrez
removed_email_address@domain.invalidescribió:


#14

Bueno.

He arrancado desde la consola de cmd y sigue sin funcionar.
He comprobado la versión rails y es 2.2.2
La versión de las gemas es la 1.3.1

Y el rake routes me da esto:

Microsoft Windows [Versión 6.0.6001]
Copyright © 2006 Microsoft Corporation. Reservados todos los
derechos.

C:\appserv\www>cd mytoy

C:\AppServ\www\mytoy>rake routes
(in C:/AppServ/www/mytoy)
users GET /:locale/users
{:controller=>“user
s”, :action=>“index”}
formatted_users GET /:locale/users.:format
{:controller=>“user
s”, :action=>“index”}
POST /:locale/users
{:controller=>“user
s”, :action=>“create”}
POST /:locale/users.:format
{:controller=>“user
s”, :action=>“create”}
new_user GET /:locale/users/new
{:controller=>“user
s”, :action=>“new”}
formatted_new_user GET /:locale/users/new.:format
{:controller=>“user
s”, :action=>“new”}
edit_user GET /:locale/users/:id/edit
{:controller=>“user
s”, :action=>“edit”}
formatted_edit_user GET /:locale/users/:id/edit.:format
{:controller=>“user
s”, :action=>“edit”}
user GET /:locale/users/:id
{:controller=>“user
s”, :action=>“show”}
formatted_user GET /:locale/users/:id.:format
{:controller=>“user
s”, :action=>“show”}
PUT /:locale/users/:id
{:controller=>“user
s”, :action=>“update”}
PUT /:locale/users/:id.:format
{:controller=>“user
s”, :action=>“update”}
DELETE /:locale/users/:id
{:controller=>“user
s”, :action=>“destroy”}
DELETE /:locale/users/:id.:format
{:controller=>“user
s”, :action=>“destroy”}
posts GET /:locale/posts
{:controller=>“post
s”, :action=>“index”}
formatted_posts GET /:locale/posts.:format
{:controller=>“post
s”, :action=>“index”}
POST /:locale/posts
{:controller=>“post
s”, :action=>“create”}
POST /:locale/posts.:format
{:controller=>“post
s”, :action=>“create”}
new_post GET /:locale/posts/new
{:controller=>“post
s”, :action=>“new”}
formatted_new_post GET /:locale/posts/new.:format
{:controller=>“post
s”, :action=>“new”}
edit_post GET /:locale/posts/:id/edit
{:controller=>“post
s”, :action=>“edit”}
formatted_edit_post GET /:locale/posts/:id/edit.:format
{:controller=>“post
s”, :action=>“edit”}
post GET /:locale/posts/:id
{:controller=>“post
s”, :action=>“show”}
formatted_post GET /:locale/posts/:id.:format
{:controller=>“post
s”, :action=>“show”}
PUT /:locale/posts/:id
{:controller=>“post
s”, :action=>“update”}
PUT /:locale/posts/:id.:format
{:controller=>“post
s”, :action=>“update”}
DELETE /:locale/posts/:id
{:controller=>“post
s”, :action=>“destroy”}
DELETE /:locale/posts/:id.:format
{:controller=>“post
s”, :action=>“destroy”}
page_index GET /:locale/page
{:controller=>"page
", :action=>“index”}
formatted_page_index GET /:locale/page.:format
{:controller=>"page
", :action=>“index”}
POST /:locale/page
{:controller=>"page
", :action=>“create”}
POST /:locale/page.:format
{:controller=>"page
", :action=>“create”}
new_page GET /:locale/page/new
{:controller=>"page
", :action=>“new”}
formatted_new_page GET /:locale/page/new.:format
{:controller=>"page
", :action=>“new”}
edit_page GET /:locale/page/:id/edit
{:controller=>"page
", :action=>“edit”}
formatted_edit_page GET /:locale/page/:id/edit.:format
{:controller=>"page
", :action=>“edit”}
page GET /:locale/page/:id
{:controller=>"page
", :action=>“show”}
formatted_page GET /:locale/page/:id.:format
{:controller=>"page
", :action=>“show”}
PUT /:locale/page/:id
{:controller=>"page
", :action=>“update”}
PUT /:locale/page/:id.:format
{:controller=>"page
", :action=>“update”}
DELETE /:locale/page/:id
{:controller=>"page
", :action=>“destroy”}
DELETE /:locale/page/:id.:format
{:controller=>"page
", :action=>“destroy”}
/:controller/:action/:id
/:controller/:action/:id.:format
root /:locale
{:controller=>"page
", :action=>“index”}

Me da la impresión de que está enrutando bien ¿no?

El 21 de febrero de 2009 11:50, Fernando removed_email_address@domain.invalid escribió:


#15

Fernando, lo he logrado hacer funcionar aplicando el siguiente parche:
http://rails.lighthouseapp.com/attachments/77108/default_url_options-2.patch

lo malo es que he tenido que aplicar el parche manualmente, ya que no me
funcionaron ni “patch -p0 …” ni “git apply …”, si alguien lograra
aplicar el parche de forma automatica seria genial.

Saludos!


#16

Yo hice un plugin para añadir localización a las URLs, quizá te sea
más cómodo echarle un vistazo antes de parchear rails:

http://github.com/raul/translate_routes/tree/master


#17

La verdad es que en el hilo ese lo vi, pero me quedé un poco pillao con
lo
del tema parche.
¿Cómo se aplica un parche?

No he utilizado ninguno hasta ahora. O simplemente si me puedes
facilitar
algun link a algun tutorial…
Si no mañana cuando me ponga con esto, googlearé un rato con el tema
parches.

Muchas gracias de todos modos Rubén :wink:

El 22 de febrero de 2009 4:08, Ruben. D.
removed_email_address@domain.invalidescribió:


#18

Perdona Raul,

Acabo de probar tu plugin y algo debo hacer mal que no me rula…

He colocado tu pluging tal que así vendor/plugins/translate_routes

Luego mi application.rb ha quedado así:

class ApplicationController < ActionController::Base
helper :all

before_filter :set_locale_from_url

protected
def authorize
unless User.find_by_id(session[:user_id])
flash[:notice] = t(“please_login”)
redirect_to :controller => :admin, :action => :login
end
end
end

Y mi routes.rb así:

ActionController::Routing::Routes.draw do |map|
ActionController::Routing::Translator.i18n(‘es’)

map.connect ‘:controller/:action/:id’
map.connect ‘:controller/:action/:id.:format’

map.resources :users
map.resources :posts
map.resources :page
map.root :controller => “page”

end

¿Esta todo bien?¿Que hago mal?

Muchas gracias.
El 23 de febrero de 2009 9:57, Fernando removed_email_address@domain.invalid escribió:


#19

Acabo de leer la documentación de tu plugin y me parece muy interesante.
Así
que le daremos una vuelta al asunto a ver que tal. Y si me atasco te
pido
ayuda Raul.Muchas gracias.

2009/2/22 Raul M. removed_email_address@domain.invalid


#20

El día 24 de febrero de 2009 15:32, Fernando removed_email_address@domain.invalid
escribió:> Perdona Raul,

Acabo de probar tu plugin y algo debo hacer mal que no me rula…

Creo que el problema es sólo dónde has metido la llamada al traductor:
hay que hacerla después de la declaración de las rutas:

map.root :controller => “page”

end
ActionController::Routing::Translator.i18n(‘es’) # …y debe ir aqu