2010-04-13 16 views
16

sto cercando di raggiungere gli URL di questo tipo in Rails:ID nome + Slug in URL in Rails (come in StackOverflow)

http://localhost/posts/1234/post-slug-name 

sia con ID e slug nome invece di una

http://localhost/posts/1234 

o

http://localhost/posts/post-slug-name 

(in questo momento ho appena slug nome nel URL, quindi questa parte è finita). Come posso fare questo?

UPD

ho trovato un articolo su questo: http://augustl.com/blog/2009/styling_rails_urls/, invece di /id/slug suggerisce di utilizzare /id-slug che funziona perfettamente per me, così io andrò con questo.

risposta

9

Aggiungere una route regolare con Route Globbing in aggiunta al percorso della risorsa (presupponendo ovviamente che siano definite le route posts). Ad esempio,

map.resources :posts 
map.connect '/posts/:id/*slugs', :controller => 'posts', :action => 'show' 
30

Rails ha un supporto integrato per gli URL SEO friendly.

è possibile creare un URL nella forma: "id-title" semplicemente l'override del metodo to_param nel modello.

Questo è da uno dei miei progetti e crea un URL con l'id, nome della categoria e nome del modello:

def to_param 
    "#{id}-#{category.name.parameterize}-#{name.parameterize}" 
end 

Rails è abbastanza intelligente per estrarre questo nuovamente dentro l'id normale quando si accede azione di controllo , quindi il seguente funziona solo:

def show 
    @model = Model.find(params[:id]) 
    render :action => "show" 
end 
+0

Sì, questo è quello che ho in UPD. In realtà ho usato anche questo approccio. – Vitaly

+0

Eccellente !! ha funzionato alla grande! Grazie! – yorch

7

Usa friendly_id. Ha una bella caratteristica: puoi aggiornare il tuo URL senza rompere quello vecchio.

L'URL di visualizzazione generati non funziona per me. Ho appena aggiunto un piccolo metodo nel modello di

def to_param 
    self.friendly_id 
end 
0

la gemma stringex contiene ActsAsUrl per creare rappresentazioni URI-amichevoli di un attributo

https://github.com/rsl/stringex

Esso contiene anche una biblioteca Unidecoder, che può convertire Unicode in ASCII.

0

I wrote a post su slug in Rails 3. Fornisce URL piuttosto che, ancor più, protegge il tuo sito da script casuali che richiedono informazioni semplicemente aumentando gli ID. Inoltre evita di salvare le lumache nel database.

4

So che la domanda è piuttosto vecchia, ma penso che meriti ancora un certo interesse e nessuna delle risposte è aggiornata o fornisce un modo per generare esattamente ciò che l'OP cercava (ad esempio http://localhost/posts/1234/post-slug-name).

Nelle rotte.rb

get 'posts/:id/:slug', to: 'posts#show', as: 'slugged_post' 

Poi le viste

<%= link_to slugged_post_path(post, post.name.parameterize) %> 

È possibile definire un metodo di lumaca nel modello per evitare di chiamare parametrizzare il punto di vista.

+1

che dovrebbe essere 'slugged_post_path' nella chiamata' link_to'. – Rystraum