Aiuto su routing particolare

ciao ragazzi. mi son letto il routing di rails 3 ma non ho trovato
quello che cercavo, quindi spero in un vostro aiuto.

sono alle prese con un blog (per imparare rails) ed ho - semplifico -
due controller + model: post e categories

categories has_many posts
e
post belongs_to category

tutto funziona a meraviglia.
le categories sono accessibili all’url /categories mentre i post all’url
/posts.
io vorrei far si che quando apro un post (action show), l’url diventi
/categoria_post/nome_post, anzichè /post/id.

sapete se è possibile realizzare una cosa del genere? dico da subito che
le relazioni funzionano e non ci sono problemi, l’unica cosa di cui ho
bisogno è di aggiungere la categoria del post all’url.

potete darmi una mano? an si, uso rails 3.

grazie mille!

puoi fare qualcosa del genere:

resources :categories do
resources :posts
end

in questo modo avrai i posts sempre sotto una specifica categoria e
genererai le
url con qualcosa tipo: category_post_url(categoia, post).

ciao,
A.

Il 22/01/2011 13:37, Dino D. ha scritto:

tutto funziona a meraviglia.

grazie mille!


http://twitter.com/apeacox

grazie andrea e grazie per le tue risposte in questo e altri topic.
forse non mi sono spiegato bene io. procediamo per step.

ho diverse categorie (/categories/): macchine, fiori, lavoro

1: come faccio a far uscire nell’url /categories/macchine anzichè
/categories/3 <- id ??

2: mettiamo che nell’home page ho un post chiamato ‘la nuova formula 1’,
che appartiene alla categoria macchine. ora, voglio far si che quando
apro il post, mi venga mostrato un url del tipo:
/categories/macchine/la-nuova-formula-1 anzichè /posts/5 <- id

3: ciliegina sulla torta, rails ha un suo rewrite interno? per esempio,
come faccio a visualizzare /categorie (in italiano) anzichè il nome del
controller /categories ??

grazie!

risposta in quote :wink:

Il 22/01/2011 17:32, Dino D. ha scritto:

ho diverse categorie (/categories/): macchine, fiori, lavoro

1: come faccio a far uscire nell’url /categories/macchine anzich
/categories/3<- id ??
puoi usare il plugin permalink_fu
(GitHub - technoweenie/permalink_fu: ActiveRecord plugin for automatically converting fields to permalinks.
https://github.com/technoweenie/permalink_fu) che ti permette
facilmente di
usare una stringa al posto di un id per trovare il record. nella action
di un
controller avresti un codice tipo:

Post.find_by_permalink(params[:id])

2: mettiamo che nell’home page ho un post chiamato ‘la nuova formula 1’,
che appartiene alla categoria macchine. ora, voglio far si che quando
apro il post, mi venga mostrato un url del tipo:
/categories/macchine/la-nuova-formula-1 anzich /posts/5<- id
con le routes impostate come ti ho indicato ieri, otterresti una URL
strutturata
come vuoi tu. usando permalink_fu userai il permalink anzich l’id

3: ciliegina sulla torta, rails ha un suo rewrite interno? per esempio,
come faccio a visualizzare /categorie (in italiano) anzich il nome del
controller /categories ??
fortunatamente rails3 permette di tradurre in pi lingue anche le routes.
non ho
mai affrontato questo argomento, comunque una ricerca su google con
“rails3 i18n
routes” dovresti trovare un po’ di risultati :wink:

ciao,
A.


http://twitter.com/apeacox

ciao andrea. provando a modificare le routes, in questa maniera:


#resources :posts

resources :categories do
resources :posts
end

e commentando ‘resources :posts’ mi esce il seguente errore:

No route matches {:controller=>“posts”}

se invece non commento ‘resources :posts’ l’errore non esce e tutto
torna a funzionare come prima, ma comunque /categories/macchine/post_id
non funziona. che devo fare?

per il rewrite degli url ho trovato una soluzione più semplice (anche se
meno valida di permalink_fu), che consiste nell’aggiungere al model la
funzione

def to_param
“#{id}-#{name.downcase.gsub(/[^a-z0-9]+/i, ‘-’)}”
end

che mi mostrerà gli url nel seguente formato /posts/10-formula-1 , in
cui ‘10-’ è l’id del post. con permalink_fu invece, il risultato sarebbe
diverso, cioè /posts/formula-1 (senza l’id nell’url). al momento mi
basta così, anche perchè non ho voglia di provare permalink XD

Il 23/01/2011 14:19, Dino D. ha scritto:

e commentando ‘resources :posts’ mi esce il seguente errore:

No route matches {:controller=>“posts”}

dipende da quado/come vuoi raggiungere una risorsa. se tu vuoi
raggiungere i
posts con una url tipo:

/posts/un-post

allora nelle routes userai:

resources :posts

se invece preferisci le rotte verso i posts che passano anche per la
categoria,
allora userai:

resources :categories do
resources :posts
end

in questo caso le url saranno:

/categories/:category_id/posts/:id

potresti anche lasciare entrambe, ma in quel caso ti conviene usare gli
helper:

category_post_url(category,post)

post_url(post)

infine, ricorda che puoi sperimentare con le routes guardando quali
rotte hai a disposizione, basta lanciare il comando:

rake routes

aiutati anche con la guida che trovi
su:Rails Routing from the Outside In — Ruby on Rails Guides

non conoscendo come stai gestendo la tua app, non posso esserti pi utile
:wink:

ultima cosa, con permalink_fu puoi ottenere le url con il formato che
vuoi, basta specificarlo :stuck_out_tongue:

ciao,
A.

end

che mi mostrer gli url nel seguente formato /posts/10-formula-1 , in
cui ‘10-’ l’id del post. con permalink_fu invece, il risultato sarebbe
diverso, cio /posts/formula-1 (senza l’id nell’url). al momento mi
basta cos, anche perch non ho voglia di provare permalink XD


http://twitter.com/apeacox

ok dai ci sono riuscito.
ora però mi risulta un altro problema…mannaggia!

/categories/:category_id/posts/:id

come faccio a ‘togliere’ posts dall’url?
in modo che mi risulti così:

/categories/:category_id/:id_del_post


edit, problema 2:

usando l’helper [ ‘category_post_url(post)’ ← da un partial ]

<%= link_to activities.name, category_activities_url(activities) %>

il link in questione mi punta a:

http://127.0.0.1:3000/categories/10-formula-1/posts

io invece lo vorrei:

http://127.0.0.1:3000/categories/macchine(cat.name)/10-formula-1

cosa alquanto strana. premetto che il link comunque funziona.
se ti serve sapere qualcosa di specifico sull’app te lo faccio sapere.

grazie dell’aiuto andrea

problema 2 risolto, dovevo creare il link con
category_post_url(@category,post)

ora mi rimane il problema 1:

/categories/:category_id/posts/:id

come faccio a ‘togliere’ posts dall’url?
in modo che mi risulti così:

/categories/:category_id/:id_del_post

leggendomi bene come funzionano le routes sono riuscito a far funzionare
l’url /categories/:category_id/:id_del_post, aggiungendo al routes.rb la
linea:

match ‘categories/:category_id/:id’ => ‘posts#show’

quello che non capisco, è perchè l’helper category_activity_url mi
generi ancora l’url nel formato:

/categories/:category_id/posts/:id

non so, sto diventando pazzo!!