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 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