2011-10-12 32 views
19

Próbuję zmienić trasy szyn z/users/1 na/username. W tej chwili ustawiam to tak, aby działał na potrzeby pokazywania i edycji. Rzeczywisty problem jest to, że kiedy idę do aktualizacji użytkownika za pomocą:Routing trasy do nazwy użytkownika zamiast id

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

nigdy nie aktualizacji, ponieważ działanie aktualizacja jest kierowany do użytkowników//: id. Czy istnieje sposób na przekierowanie go tak, aby działał na/username? (która jest trasą renderującą w moich formularzach jako działanie). Od pewnego czasu drapałem się po tej głowie.

EDIT:

Kwestia nie jest routing do nazwy użytkownika, że ​​działa poprawnie. Problem polega na tym, że formularz prowadzi do/username for update, jednak trasa aktualizacji dla użytkowników to nadal/users /: id zamiast:/id.

Próbowałem aktualizacji moich trasy do tego, ale bezskutecznie:

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! To naprawić problem:

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

Odpowiedz

32

w modelu użytkownika:

def to_param 
    username 
end 

Sposób to_param na ActiveRecord obiektów zastosowań, domyślnie tylko identyfikator obiektu. Umieszczenie tego kodu w modelu powoduje nadpisanie domyślnego rekordu ActiveRecord, więc po połączeniu z użytkownikiem będzie on używał parametru username dla parametru zamiast id.

17

W modelu użytkownika zastępuje się metodą to_param, aby zwrócić to, co ma być użyte w adresie URL.

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

W kontrolerze zamiast korzystania User.find(params[:id]) teraz trzeba użyć User.find_by_username(params[:id])

+1

byłoby lepiej, aby określić 'param:: username' w trasach f ile? Ponieważ param nie powinien już być nazywany ': id', ale zamiast tego powinien być nazywany': username' –

0

Nie trzeba zastąpić to_param jeśli nie chcesz, możesz po prostu podać w tagu formularza jak ta :

<%= form_for @user, :url => user_path(:id => @user.username) do |f|%> 
Powiązane problemy