ruby-on-rails - 覆盖 Rails to_param?

标签 ruby-on-rails

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

相关文章:

ruby-on-rails - Rails 浏览器 gem 为所有报告的信息返回 'generic'

ruby-on-rails - Heroku pg迁移错误 "PG:DataCorrupted: Error"

ruby-on-rails - 如何从事件记录集合中获取所有 has_many 关联

ruby-on-rails - Rails 服务器命令在使用 rails 4.0.2 和 ruby​​ 2.0.0 版本 (x32) 的 Windows XP 中返回错误

mysql - 为什么除非我更改值文本,否则我的表单不会返回匹配结果?

ruby-on-rails - Rails回形针图像压缩与Page Speed产生的图像相比

ruby-on-rails - 在 Rails 3 模型中,DateTime 属性是错误的 "dirty"

ruby-on-rails - 如何防止 Rails 处理大型 XML 帖子

mysql - db :schema:dump on RDS with mysql. 错误:无法转储表 "",因为以下 NoMethodError 未定义方法 `type' for "int(11)":String

ruby-on-rails - gem 突然不见了