2

我正在嘗試爲簡單的小型應用程序創建語義URL,但我堅持使用to_param並檢索記錄。這是Post型號:在Rails中用slu instead代替id查找記錄

class Post < ActiveRecord::Base 
    after_create :create_slug 

    validates :title, :body, :presence => true 
    validates :title, length: { maximum: 250 } 
    validates :body, length: { maximum: 5000 } 

    def to_param 
    slug 
    end 

    private 
    def create_slug 
    self.slug = slugify 
    end 

    def slugify 
    [year_month_day, title.parameterize].join("-") 
    end 

    def year_month_day 
    [created_at.year, created_at.strftime("%m"), created_at.strftime("%d")].join 
    end 
end 

現在,每當我與鏈接到link_to @post.title, @post職位時間,我得到這個錯誤:

No route matches {:action=>"show", :controller=>"posts", :id=>nil} missing required keys: [:id] 

show動作看起來是這樣的:

def show 
    @post = Post.find_by_slug(params[:id]) 
end 

當我這樣做時,它試圖找到與slu as作爲id的職位,但slu is不是id,所以我得到一個錯誤。當我使用標準find(params[:id])時,它無法找到記錄,因爲to_param被覆蓋。

我錯過了什麼?

謝謝。

回答

3

更改after_create :create_slugbefore_create :create_slug

如果你想使用after_create,你必須在設置slug後保存對象。

+0

解決了它,謝謝!我不認爲你可以調用'before_create'傳遞一個依賴'created_at'字段的方法。 – abbottjam 2014-09-23 15:22:43