2011-10-12 15 views
19

Estoy tratando de cambiar las rutas de los raíles desde/users/1 a/username. Actualmente configuré esto para que funcione para las acciones de mostrar y editar. El problema real es que cuando voy a actualizar el usuario mediante el uso de:Rieles ruta a nombre de usuario en lugar de id

<%= form_for @user do |f|%> 

Nunca actualizaciones, ya que la acción de actualización se encamina a/usuarios /: id. ¿Hay alguna manera de enrutar esto para que funcione para/username? (que es la ruta que está renderizando en mis formularios como la acción). He estado rascándome la cabeza por este desde hace un tiempo.

EDIT:

El problema no es el enrutamiento a nombre de usuario, que trabaja correctamente. El problema es que el formulario se dirige a/username para la actualización, sin embargo, la ruta de actualización para los usuarios sigue siendo/users /: id en lugar de:/id.

He intentado actualizar mis rutas de esto, pero en vano:

match '/:id', :to => "users#show", :as => :user 
match '/:id', :to => "users#update", :as => :user, :via => :put 
match '/:id', :to => "users#destroy", :as => :user, :via => :delete 

EDIT:

Doh! Esto ha solucionado el problema:

match '/:id', :to => "users#show", :as => :user, :via => :get 

Respuesta

32

En su modelo de usuario:

def to_param 
    username 
end 

El método to_param en ActiveRecord objetos usos, por defecto, sólo el ID del objeto. Al poner este código en su modelo, está sobrescribiendo el valor predeterminado de ActiveRecord, por lo que cuando se vincula a un usuario, utilizará el username para el parámetro en lugar de id.

17

En el modelo de usuario, anule el método to_param para devolver lo que desea utilizar en la URL.

class User < ActiveRecord::Base 
    def to_param 
    username 
    end 
end 

En su controlador en lugar de utilizar User.find(params[:id]) ahora tiene que usar User.find_by_username(params[:id])

+1

¿sería mejor para especificar 'param:: username' en el f rutas ile? Debido a que el parámetro ya no debería llamarse ': id', sino que debería llamarse': username' –

0

Usted no tiene que anular to_param si no quiere, sólo puede especificar en la etiqueta del formulario como el siguiente :

<%= form_for @user, :url => user_path(:id => @user.username) do |f|%> 
Cuestiones relacionadas