Model Page i urle z numerem strony

czesc
mam model Page i tabele pages, które jak sama nazwa wskazuje służą do przechowywania strony (strona ma tytuł, opis i takie tam), do stron przypisane są jeszcze grupy itd. Jak najzgrabniej zrobic coś takiego żeby w URLu był numer strony (w bazie pole position) zamiast id, ponieważ może to być mylące dla użytkownika ? Aha, strony i przypisane grupy sa dodawane przez użytkownika, nie robi tego żaden plugin,

Najprościej zrobić to za pomocą tzw. zagnieżdżonych zasobów (nested resources). Jeśli masz model typu Book, który grupuje strony, tj.:

class Book < ActiveRecord::Base has_many :pages end class Page < ActiveRecord::Base belongs_to :book end
… wystarczy zagnieździć kontroler “pages” w kontrolerze “books”, tj. (config/routes.rb):

map.resources :books do |books| books.resources :pages do |pages| pages.resources :groups end end
W tym momencie akcja show w kontrolerze page wygląda następująco:

class PagesController < ApplicationController def show @book = Book.find(params[:book_id]) # najlepiej przenieść do before_filter @page = @book.pages.find_by_position(params[:id]) end end
Ścieżka będzie wtedy wyglądała tak: /books/23/pages/2 , gdzie 23 - id książki a 2 - numer strony w obrębie książki. Podobnie możesz zagnieździć grupy, itp. Jeśli nie używasz żadnych pluginów, to polecam zerknąć na http://gemcutter.org/gems/acts_as_list - z automatu zarządza polem position.

sorki, używam właśnie acts_as_list, zapomniałem :slight_smile: Dzięki za kod, mniej więcej tak sobie planowałem, chciałem się upewnić czy nie ma jakiś lepszych sposobów
hmmm, a jak rozwiązac sprawę formularza, teraz mam coś w stylu

form_for(@page, :url => page_path(@book, @page)) do |f|

czyli w urlach jest id, najlepiej by bylo zeby page_url bylo z numerem strony, bo tak to wiele zmian, np nie moge teraz uzywac redirect_to page_url

w PagesController muszę np teraz stosować coś takiego

redirect_to page_url(:id => @page.position)

ponieważ w innym przypadku bierze oczywiście id z bazy. Może w routes trzeba coś przykombinować ?

Powinieneś raczej korzystać z zagnieżdżonych ścieżek, w stylu book_page_url(@book, @page.position) - nie przychodzi mi w tej chwili żaden pomysł uproszczenia tego zapisu.

na to ostatnie znalazłem chyba eleganckie rozwiązanie, w modelu Page

def to_param "#{position}" end
tutaj jest coś podobnego opisane
http://www.jroller.com/obie/entry/seo_optimization_of_urls_in