2012-07-19 55 views
5

我想要實現與能力博客\新聞應用程序:Rails的日期3.2友好的URL路由

  1. 顯示所有帖子的根:example.com/
  2. 顯示所有帖子回答一些年:example.com/2012/
  3. 秀回答一些年份和月份的所有帖子:example.com/2012/07/
  4. 表現出一定的崗位以它的日期和毛坯:example.com/2012/07/slug-of-the-post

所以我創建了一個樣機的routes.rb文件:

# 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\-]+/ } 

所以我應該使用參數工作,index行動和剛剛獲得通過塞後在show行動(檢查日期是否corect是一個選項):

# 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 

而且我要實現to_param爲我的模型:

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

這是我從整夜在api/guides/SO搜索中學到的。

但問題是奇怪的事情不斷happenning我作爲新軌:

  1. 當我去localhost/,應用程式的空檔,並說,它援引show行動,但第一個對象在數據庫已收到爲:(!原文如此)年:

    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. 當我去localhost/posts/2012/07/cut-test同樣的事情發生:

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

我覺得有一些很容易的,我沒有做,但我找不到它是什麼。

無論如何,這個帖子在解決問題時會有所幫助,因爲只有url的解決方案只適用於沒有日期和類似但沒有用的問題。

回答

5

的問題是在後期的路徑幫手用法post_path(post),因爲第一個參數必須是今年以來我在使用:as => :postroutes.rb參數化比賽。

儘管如此,使整個解決方案清楚這裏有一些動作需要做出所有工作正確:

  1. 您必須添加正確的路徑名助手每場比賽,例如現在

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

    你可以在視圖中使用post_date_path("2012","12","end-of-the-world-is-near")

    posts_path,posts_year_path("2012"),posts_month_path("2012","12")相同如果命名正確。

    我建議不要使用在那場比賽既沒有:as => :post也創造to_param在模型文件,因爲它可以打破一些你不希望(我爲active_admin)。

  2. 控制器文件posts-controller.rb應該充滿了需要提取和蛞蝓以前日期的正確性的檢查崗位。然而在這種情況下它是確定並打破什麼。

  3. 型號文件posts.rb應該充滿年份和月份extraciton在適當的格式,例如:

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

    沒有to_param方法真正需要的,因爲我已經注意到了。

0

這是你的完整routes.rb文件嗎?聽起來像你可能有一個前面的resources :posts條目,基本上匹配/posts/:id。另外,我從你發佈的路由文件中看不到任何可能導致從根路徑重定向到帖子的路由文件,因此它必須是其他內容。

+0

在此之前有2個'active_admin'指令,所以我不需要所有的資源。 – iEugene 2012-07-20 09:30:35