User.find('123-foobar')将返回ID为123的User

时间:2012-05-01 10:45:35

标签: ruby-on-rails ruby-on-rails-3 friendly-id

我已在github询问,但也会尝试在这里询问。没有什么是错误的"足智多谋" ;-)。使用friendly_id 4.

我用slug =>创建了一个用户" 123 foobar"。此用户的ID为200。

执行User.find('123-foobar')时,它会返回ID为123的用户,而不是用户200。

这是一个错误吗?

1 个答案:

答案 0 :(得分:7)

find方法(当第一个参数不是符号时)按主键查找。如果您想将slug作为主键,请执行以下操作:

class User < ActiveRecord::Base
  set_primary_key :slug
end

这样做,find会通过slug字符串找到,而to_param将从slug返回字符串。您的路径和网址助手也应该使用slug。你的外键也必须使用slug。但是,现在,查找按ID查找。

如果您希望id一如既往地工作和/或您不希望所有行为发生变化,但slug是用户的替代搜索方法,则按以下方式搜索:

User.find_by_slug('123-foobar')

你的路线没问题,但是如果slug位于:id所在的URL中,它将以params [:id]传递给控制器​​。因此,您可以使用与slug和id相同的URL,控制器和操作,但您的控制器必须确定要搜索的内容。

class User < ActiveRecord::Base
  def self.slug?(key)
    /^\d*-./ =~ key
  end

  def self.find_from_key(key)
    slug?(key) ? find_by_slug(key) : find(key)
  end
end

class UsersController < ApplicationController
  def edit
    @user = find_from_key(params["id"])
    ...