2012-07-19 11 views
5

chcę wdrożyć aplikację blog \ aktualności z możliwością:Rails 3.2 przyjazne url routingu według daty

  1. pokazać wszystkie posty na root: example.com/
  2. Pokaż wszystkie posty odpowiadając na kilka lat: example.com/2012/
  3. pokaż Wszystkie posty odpowiedzi na kilka lat i miesięcy: example.com/2012/07/
  4. wykazują pewną post przez jego datę i ślimak: example.com/2012/07/slug-of-the-post

Więc stworzyliśmy makieta routes.rb pliku:

# GET /?page=1 
root :to => "posts#index" 

match "/posts" => redirect("/") 
match "/posts/" => redirect("/") 

# Get /posts/2012/?page=1 
match "/posts/:year", :to => "posts#index", 
    :constraints => { :year => /\d{4}/ } 

# Get /posts/2012/07/?page=1 
match "/posts/:year/:month", :to => "posts#index", 
    :constraints => { :year => /\d{4}/, :month => /\d{1,2}/ } 

# Get /posts/2012/07/slug-of-the-post 
match "/posts/:year/:month/:slug", :to => "posts#show", :as => :post, 
    :constraints => { :year => /\d{4}/, :month => /\d{1,2}/, :slug => /[a-z0-9\-]+/ } 

Więc powinienem pracować z params w index działania i po prostu post przez ślimak w show działanie (sprawdzenie, czy data jest corect jest opcją):

# GET /posts?page=1 
def index 
    #render :text => "posts#index<br/><br/>#{params.to_s}" 
    @posts = Post.order('created_at DESC').page(params[:page]) 
    # sould be more complicated in future 
end 

# GET /posts/2012/07/19/slug 
def show 
    #render :text => "posts#show<br/><br/>#{params.to_s}" 
    @post = Post.find_by_slug(params[:slug]) 
end 

również muszę wdrożyć to_param dla mojego modelu

def to_param 
    "#{created_at.year}/#{created_at.month}/#{slug}" 
end 

To wszystko, czego nauczyłem się od całonocnych poszukiwań w api/guide/SO.

ale problem jest dziwne rzeczy ciągle happenning dla mnie jako nowe do szyn:

  1. Kiedy idę do localhost/, przerwy aplikację i mówi, że to był wywoływany show działania, ale pierwszy obiekt w bazie zostały otrzymaliśmy jako: (sic!) roku:

    No route matches {:controller=>"posts", :action=>"show", :year=>#<Post id: 12, slug: "*", title: "*", content: "*", created_at: "2012-07-19 15:25:38", updated_at: "2012-07-19 15:25:38">} 
    
  2. Kiedy idę do localhost/posts/2012/07/cut-test samo dzieje:

    No route matches {:controller=>"posts", :action=>"show", :year=>#<Post id: 12, slug: "*", title: "*", content: "*", created_at: "2012-07-19 15:25:38", updated_at: "2012-07-19 15:25:38">} 
    

czuję, że coś jest bardzo łatwe, że nie dokonały, ale nie mogę znaleźć co to jest.

W każdym razie, ten post będzie pomocny, gdy zostanie rozwiązany, ponieważ istnieją rozwiązania tylko dla samych błędów w adresie URL bez daty i podobnych, ale nieprzydatnych pytań.

Odpowiedz

5

Problem polegał na drodze użycia pomocnika słupka jako post_path(post), ponieważ pierwszy parametr musi być rok odkąd używam :as => :post w parametryzowane mecz w routes.rb.

Niemniej jednak, aby wyjaśnić całą rozwiązanie tutaj są niektóre działania potrzebne do pracy, że wszystkie właściwe:

  1. Należy dodać właściwą ścieżkę pomocników nazwy dla każdego meczu, na przykład

    # Get /posts/2012/07/slug-of-the-post 
    match "/posts/:year/:month/:slug", <...>, 
        :as => :post_date 
    

    Teraz można używać widoków post_date_path("2012","12","end-of-the-world-is-near").

    To samo dotyczy posts_path, posts_year_path("2012"), posts_month_path("2012","12"), jeśli jest odpowiednio nazwane.

    radzę, aby nie używać ani :as => :post w tym meczu ani tworzenie to_param w pliku modelu, ponieważ może złamać coś nie oczekiwać (jak active_admin dla mnie).

  2. Plik kontrolera posts-controller.rb należy wypełnić za pomocą słupków, które wymagały wyodrębnienia i sprawdzenia poprawności daty przed ślimakiem. Niemniej jednak w tym stanie jest OK i nic nie zepsuje.

  3. model plik posts.rb powinna być wypełniona rok i miesiąc extraciton we właściwym formacie, np .:

    def year 
        created_at.year 
    end 
    
    def month 
        created_at.strftime("%m") 
    end 
    

    istnieje żaden to_param metoda naprawdę potrzebne jak już zauważył.

0

Czy to Twój pełny plik routes.rb? Wygląda na to, że możesz mieć wpis poprzedzający resources :posts, który zasadniczo pasuje do /posts/:id. Ponadto, z pliku tras, który wysłałeś, nie ma nic, co mogłoby spowodować przekierowanie ze ścieżki głównej do postów, więc musi to być coś innego.

+0

Są 2 dyrektywy 'active_admin' przed tym tylko, więc nie potrzebuję wszystkich tych zasobów. – iEugene