2008-12-21 49 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