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
被覆蓋。
我錯過了什麼?
謝謝。
解決了它,謝謝!我不認爲你可以調用'before_create'傳遞一個依賴'created_at'字段的方法。 – abbottjam 2014-09-23 15:22:43