如何让 to_param 方法始终提供关键字 slug?我很难让它与这条路线一起工作:
map.pike '/auction/:auction_id/item/:id', :controller => 'items', :action => 'show'
早些时候被覆盖的 to_param 正在为
'items/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)
最佳答案
我不确定我是否理解你的问题。 (这里是凌晨 3 点 41 分)
就我所见,你直接访问auction_id
方法,而不是使用 pike_path(auction, item)
那会使用 #to_param
.
此外,它可能会失败 auction/123/item/1
因为你没有改变你的 Controller 。
我认为描述如何获得有效的蛞蝓会很有帮助。
一般来说,如果你覆盖 #to_param
, ID 不再有效。这意味着,如果您使用 slug,每次生成多态 URL(例如, link_to object, object
)时,它都会传递 to_param 的值。值得注意的是,您还必须更改 Controller 。
我个人认为轻松生成 slug 的最佳方法是使用 techno-weenie 的 permalink_fu , 添加 has_permalink
到您的模型,然后覆盖 to_param
.例如
class Auction < ActiveRecord::Base
has_permalink :title, :slug
end
假设您有 slug,一个字符串字段,并且想要 slugize 您的标题。
您还需要调整您的 Controller :
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
然后,您可以在 View 中以这种方式生成路由:
link_to @action, @action
顺便说一句,您不应该在 View 中对您的操作进行排序。最好的方法是使用
named_scope
.
关于ruby-on-rails - 覆盖 Rails to_param?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/384316/