2010-06-18 49 views
2

我有一個基本的「公司」模型CRUD。爲了使公司的名稱顯示出來,我確實人類可讀的URL導致Ruby on Rails中的問題

def to_param 
    name.parameterize 
end 

然後我訪問http://localhost:3000/companies/american-express它運行在公司的控制器show行動。

顯然,這並不工作,因爲show方法如下:

def show 
    @company = Company.find_by_id(params[:id]) 
end 

params[:id]american-express。該字符串不存儲在任何地方。

當我保存記錄時,是否需要在數據庫中存儲短字符串(即「american-express」)?或者有什麼方法可以在不將數據庫字符串保存在數據庫中的情況下檢索公司數據?

回答

3

發送帶有參數化值的ID;

def to_param 
    new_record? ? super : "#{id}-#{name}" 
end 

而當您在show方法中收集數據時,可以使用整個參數;

def show 
    @company = Company.find("12-american-express"); // equals to find(12) 
end 

還有一個叫permalink_fu插件,你可以閱讀更多關於here

+0

有趣的解決方案。在參數的開頭留下「id」是很有趣的。我剛跑了12美國快車「.to_i」,然後返回了12。 – 2010-06-18 11:23:33

+0

甜而簡單!謝謝@Björn。 – 2010-06-18 11:28:12

0

我在我的博客軟件中使用Category模型做類似的事情。如果你能保證,唯一的轉換parameterize方法是做給你的公司名稱與破折號代替空格字符,那麼你可以簡單地做反向:

def show 
    @company = Company.find_by_name(params[:id].gsub(/-/, ' ')) 
end 
+0

不幸的是,「參數化」要複雜得多。它不僅僅是改變空間和案例。 – 2010-06-18 11:21:10

+0

我意識到這一點。我不知道你的公司名稱有什麼限制。 – 2010-06-18 11:23:05

0

我會建議friendly_id寶石也。 它使您可以靈活地使用持久的永久鏈接slu,,還可以剝離變音符號,轉換爲完整的ASCII等。 基本上,它使您的生活變得更加輕鬆,並且您可以獲得「真正的」固定鏈接(無需to_param和需要的id解決方法)努力。

噢,我是否提到永久鏈接也是版本化的,因此您可以使舊的過期永久鏈接重定向到當前版本? :)