Come rinominare il parametro identificativo predefinito "id" in map.resources () di Rails?

StackOverflow https://stackoverflow.com/questions/810385
 Controllato

Domanda

Mi piacciono tutti i percorsi predefiniti generati da map.resources di Rail. Ma ci sono casi in cui vorrei utilizzare un identificatore non numerico nei miei percorsi. Ad esempio, se un percorso nidificato è composto da utenti e dai loro articoli, è possibile scrivere un percorso standard come tale:

map.resources :users, :has_many => [:articles] # => e.g. '/users/:id/articles/:id'

Tuttavia, ci sono molti vantaggi / ragioni per non utilizzare l'identificatore numerico predefinito generato da Rails. Esiste un modo per sostituire il parametro predefinito: id params con un altro identificatore canonico di mia scelta senza comportare la scrittura di percorsi personalizzati per ogni azione standard? Di 'se desidero un percorso nel seguente formato:

'/users/:login/articles/:id'

Questo tipo di percorsi è realizzabile utilizzando map.resources ?

Soluzione

A partire da Rails 2.3, non è possibile modificare il nome del parametro e continuare a utilizzare il routing automatico fornito da #resources .

Per ovviare al problema, puoi mappare articoli con un : path_prefix e : name_prefix :

map.resources :articles, :path_prefix => "/users/:login",
                         :name_prefix => "user_"

Il : path_prefix influenza l'URL e il : name_prefix influenza le route denominate generate, quindi finirai con queste route:

    user_articles GET    /users/:login/articles(.:format)          {:controller=>"articles", :action=>"index"}
                  POST   /users/:login/articles(.:format)          {:controller=>"articles", :action=>"create"}
 new_user_article GET    /users/:login/articles/new(.:format)      {:controller=>"articles", :action=>"new"}
edit_user_article GET    /users/:login/articles/:id/edit(.:format) {:controller=>"articles", :action=>"edit"}
     user_article GET    /users/:login/articles/:id(.:format)      {:controller=>"articles", :action=>"show"}
                  PUT    /users/:login/articles/:id(.:format)      {:controller=>"articles", :action=>"update"}
                  DELETE /users/:login/articles/:id(.:format)      {:controller=>"articles", :action=>"destroy"}

Come regola generale, tuttavia, mi atterrei alla convenzione predefinita di Rails di : user_id , con il routing che hai pubblicato nella tua domanda. Resta generalmente inteso che : id e : user_id non implicano necessariamente " identificatore numerico " & # 8212; implicano " identificatore di risorsa " qualunque cosa possa essere. E attenendosi alla convenzione predefinita, il tuo codice sarà più facile da capire per chiunque abbia utilizzato percorsi di risorse in Rails.

Per utilizzare un identificatore non numerico per una risorsa, basta ridefinire #to_param nel modello. Quindi, assicurati di utilizzare un cercatore nel controller che troverà tramite questo identificatore (anziché l'ID numerico), come User # find_by_login! .

Altri suggerimenti

Puoi modificare il valore predefinito di utilizzo dell'ID negli URL sostituendo to_param nel tuo modello. per es.

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

user_articles_path(@user) => "/users/:login/articles"

L'unica altra modifica che devi fare è trovare gli utenti tramite login anziché tramite ID nei tuoi controller.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow