覆盖Rails to_param?

时间:2008-12-21 10:20:14

标签: ruby-on-rails

如何让to_param方法始终提供关键字slug?我无法使用此路线:

map.pike'/ auction /:auction_id / item /:id',: controller => 'items',:action => '显示'

之前被覆盖的to_param正在为

工作

'的项目/ 1-绒围巾'

,但'auction/123/item/1'

失败

更新

我不确定语法是否正确[(编辑:它是正确的:它可以:-)],甚至高效....但是使用haml,我发现以下代码可以生成所需的链接( '拍卖/:auction_id /项目/: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)

1 个答案:

答案 0 :(得分:8)

我不确定我是否理解你的问题。 (现在是凌晨3点41分)

从我看到的情况来看,您可以直接访问auction_id方法,而不是使用pike_path(auction, item)使用#to_param

此外,auction/123/item/1可能会失败,因为您尚未更改控制器。

我认为描述如何获得工作slu is会很有帮助。

一般来说,如果您覆盖#to_param,则ID不再有效。这意味着,如果你使用slug,每次生成多态URL时(例如,link_to object, object),它都会传递to_param的值。值得注意的是,您也必须更换控制器。

就我个人而言,我认为轻松生成slu is的最佳方法是使用techno-weenie的permalink_fu,将has_permalink添加到模型中,然后覆盖to_param。例如

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

假设你有一个slug,一个字符串字段,并希望重新标记你的标题。

您还需要调整控制器:

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