I18n + locale na rota + form_for = problema!!

18 views
Skip to first unread message

Maurício

unread,
Jan 4, 2010, 8:13:14 AM1/4/10
to rails-br (Lista)
Ola' pessoal.

Novamente, sou iniciante no RoR mas... estou tentando fazer o certo da 1a.
vez, mesmo que inicialmente seja mais complicado, para nao ter que ficar
reescrevendo a aplicacao muitas e muitas vezes.

Seguindo o guia "A API de Internacionaliza��o do Rails (I18n)"
(http://guias.rubyonrails.pro.br/i18n.html), estava tudo indo muito bem,
ate' que cheguei a seguinte parte do item 1.5:

"IMPORTANTE: No momento essa solu��o tem uma grande desvantagem. Devido �
implementa��o de _default_url_options_, voc� tem que passar explicitamente a
op��o :id, da seguinte maneira: link_to 'Show', book_url(:id => book) e n�o
pode depender de m�gicas do Rails como link_to 'Show', book. (...)"

(Vi que tem plugins para facilitar isso, mas no momento resolvi nao me
aventurar com eles e tentar entender pelo menos o que esta' acontecendo.)

OK, apos alterar o meu "config/routes.rb" para "map.resources :users,
:path_prefix =>
'/:locale'", fiz as alteracoes nos helpers "link_to" e funcionaram sem
problemas, mas empaquei no "form_form".

O que fiz foi o seguinte:

Era:
<% form_for(@user) do |f| %>

Ficou:
<% form_for :user, @user, :url => user_url(:id => @user), :html => { :method
=> :put } do |f| %>


Mas com isso eu obtenho o seguinte erro ao tentar salvar o registro:
"Routing Error

user_url failed to generate from {:action=>"show", :locale=>#<User id: 10,
name: "aaaaaaaaa2", hashed_password: "", active: false, created_at:
"2009-12-29 21:18:56", updated_at: "2009-12-29 23:26:04">,
:controller=>"users"}, expected: {:action=>"show", :controller=>"users"},
diff: {:locale=>#<User id: 10, name: "aaaaaaaaa2", hashed_password: "",
active: false, created_at: "2009-12-29 21:18:56", updated_at: "2009-12-29
23:26:04">}
"

Obs.: o registro e' alterado corretamente, o problema ocorre quando deveria
ser exibida a pagina de listagem, apos a alteracao do registro.

Algum palpite?


[]s
Mauricio

Wilker

unread,
Jan 4, 2010, 8:36:12 AM1/4/10
to rail...@googlegroups.com
Tem que tomar cuidado pra usar o form_for com URL explicita, se voce esta usando RESTfull, lembre-se que as URL's do form_for sao diferentes entre quando o form eh para um novo registro e pra quando esta editando algum, tente sem colocar URL explicita, se nao funcionar devido ao problema anterior, tente os plugins citados, provavelmente vai ser mais facil ;)
---
Wilker Lúcio
Gerente de Tecnologia
Caju Agência Digital
http://www.caju.nu
+55 81 87417674


2010/1/4 Maurício <mauric...@gmail.com>
Ola' pessoal.

Novamente, sou iniciante no RoR mas... estou tentando fazer o certo da 1a.
vez, mesmo que inicialmente seja mais complicado, para nao ter que ficar
reescrevendo a aplicacao muitas e muitas vezes.

Seguindo o guia "A API de Internacionalização do Rails (I18n)"

(http://guias.rubyonrails.pro.br/i18n.html), estava tudo indo muito bem,
ate' que cheguei a seguinte parte do item 1.5:

"IMPORTANTE: No momento essa solução tem uma grande desvantagem. Devido à
implementação de _default_url_options_, você tem que passar explicitamente a
opção :id, da seguinte maneira: link_to 'Show', book_url(:id => book) e não
pode depender de mágicas do Rails como link_to 'Show', book. (...)"

--

Você está recebendo esta mensagem porque se inscreveu no grupo "rails-br" dos Grupos do Google.
Para postar neste grupo, envie um e-mail para rail...@googlegroups.com.
Para cancelar a inscrição nesse grupo, envie um e-mail para rails-br+u...@googlegroups.com.
Para obter mais opções, visite esse grupo em http://groups.google.com/group/rails-br?hl=pt-BR.



Maurício

unread,
Jan 5, 2010, 10:45:29 PM1/5/10
to rail...@googlegroups.com
Finalmente consegui resolver o problema depois de prestar mais atencao em um post encontrado via Google: http://railsforum.com/viewtopic.php?id=31622
 
Ou seja, o problema MESMO estava no redirect_to, e nao no form_for (ou melhor, nao APENAS no form_for).
 
Em "users_controller.rb" eu alterei os "redirect_to(@user)" para "redirect_to(user_url(:id => @user))", como sugerido no texto citado. Depois, como notei que o DELETE ja' estava funcionando sem problemas, vi que eu poderia usar, no lugar, "redirect_to(users_url)". Simples, nao? :)
 
A view NEW eu voltei para o form_for padrao gerado pelo scaffold, ou seja:
<% form_for(@user) do |f| %>
 
Tentei o mesmo com a view EDIT, mas ai nao funcionou, e tive mesmo que alterar o form_for para
<% form_for :user, @user, :url => {:action => "update"}, :html => { :method => :put } do |f| %>
 

Bom, e' isso. Agora falta eu entender melhor o que foi feito, e ai sim partir para o uso de plugins para que eu NAO precise fazer mais tais altecacoes! :P
 
 
[]s
Mauricio
 
 

Mauricio Pena

unread,
Feb 1, 2010, 8:32:01 AM2/1/10
to rail...@googlegroups.com
Bom, voltei novamente a trabalhar em cima desse problema (locale nas urls) e finalmente resolvi utilizar um plugin para facilitar as alteracoes nas views.

O que fiz:

1. instalei o plugin "routing-filter" (http://github.com/svenfuchs/routing-filter);
2. ativei o filtro "locale" adicionando/alterando as seguintes linhas no arquivo "config/routes.rb":
map.filter 'locale'
map.resources :cars, :path_prefix => '/:locale'

3. Ao acessar "http://localhost:3000/cars" obtenho a seguinte mensagem de erro:

........................................................
NoMethodError in Cars#index

Showing app/views/cars/index.html.erb where line #15 raised:

undefined method `to_sym' for #<Car:0xb723f6ec>

Extracted source (around line #15):

12:     <td><%=h car.name %></td>
13:     <td><%=h car.email %></td>
14:     <td><%=h car.active %></td>
15:     <td><%= link_to 'Show', car %></td>
16:     <td><%= link_to 'Edit', edit_car_path(car) %></td>
17:     <td><%= link_to 'Destroy', car, :confirm => 'Are you sure?', :method => :delete %></td>
18:   </tr>
.......................................................

A linha dentro do codigo do plugin que gera o erro e' a seguinte:
locale && self.class.locales.include?(locale.to_sym)


Alguma ideia de qual caminho devo seguir para solucionar esse problema, mesmo que seja NAO utilizando esse plugin e fazendo de uma outra forma?


[]s
Mauricio
Reply all
Reply to author
Forward
0 new messages