2008-12-21 53 views
8

如何獲取to_param方法始終提供關鍵字slugs?我有麻煩它與這條路線的工作:重寫Rails to_param?

map.pike '/拍賣/:auction_id /項目/:身份證',:控制器=> '項目',:動作=> '秀'

早些時候,覆蓋to_param工作爲

'項目/ 1-羊絨圍巾'

但失敗'auction/123/item/1'

更新:

我不是當然,如果語法是正確的[(編輯:它是正確的:它的工作原理:-)],或者甚至是有效的....但使用haml,我發現下面的代碼可以生成所需的鏈接('auction /:auction_id/item /:id')

- for auction in @auctions.sort{|a, b| a.scheduled_start <=> b.scheduled_start} 
    -for item in @items 
    - unless auction.current_auction 
     ... pike_path(auction.auction_id, item) 

回答

8

我不確定我是否理解您的問題。 (這是上午3:41)

從我看到的,你直接訪問auction_id方法,而不是使用pike_path(auction, item)將使用#to_param

另外,它可能因爲您沒有更改控制器而失敗auction/123/item/1

我認爲這將有助於描述如何獲得工作slu。。

一般而言,如果您覆蓋#to_param,則ID不再有效。這意味着,如果你使用slu go子,每次生成多形態網址(例如,link_to object, object),它都會傳遞to_param的值。值得注意的是,你必須改變你的控制器。

我個人認爲,容易產生蛞蝓最好的辦法是使用技術 - 威尼的permalink_fu,增加has_permalink到模型中,然後覆蓋to_param。例如

class Auction < ActiveRecord::Base 
    has_permalink :title, :slug 
end 

假設你有刺蛾,一個字符串字段,並希望slugize您的標題。

您還需要調整您的控制器:

class AuctionsController < ApplicationController 
    def show 
    @auction = Auction.find_by_slug(params[:id]) || raise(ActiveRecord::RecordNotFound) 

    respond_to do |format| 
     format.html # show.html.erb 
    end 
end 

然後,您可以生成路線,在視圖中,這樣一來:

link_to @action, @action 

順便說一句,你不應該自己的行爲進行排序在視圖中。最好的方法是使用named_scope

+3

你可以使用`find_by_slug!`,它會引發異常,除非找到 – 2012-06-23 13:18:50