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

Chr*_*ini 0 ruby-on-rails friendly-id ruby-on-rails-3

我曾经在github问过,但也会尝试在这里询问."足智多谋"没有错;-).使用friendly_id 4.

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

这样做时User.find('123-foobar'),它返回id为123的用户,而不是用户200.

这是一个错误吗?

Mar*_*rce 7

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

class User < ActiveRecord::Base
  set_primary_key :slug
end
Run Code Online (Sandbox Code Playgroud)

这样做,find会通过slug字符串找到,而to_param会从slug中返回字符串.您的路径和网址助手也应该使用slug.你的外键也必须使用slug.然而,现在,发现将不会被发现的ID.

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

User.find_by_slug('123-foobar')
Run Code Online (Sandbox Code Playgroud)

您的路由可以正常,但如果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"])
    ...
Run Code Online (Sandbox Code Playgroud)