【问题标题】:Overriding Rails to_param?覆盖 Rails to_param?
【发布时间】:2008-12-21 10:20:14
【问题描述】:

如何让 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)

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    我不确定我是否理解你的问题。 (这里是凌晨 3:41)

    据我所知,您直接访问 auction_id 方法,而不是使用 pike_path(auction, item) 那样使用 #to_param

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

    我认为描述如何获得工作的蛞蝓会很有帮助。

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

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

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

    假设你有 slug,一个字符串字段,并且想要 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

    【讨论】:

    • 你可以使用find_by_slug! 除非找到会引发异常
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    • 2015-07-30
    • 1970-01-01
    相关资源
    最近更新 更多