0

githubで質問しましたが、ここでも質問してみます。「機知に富んだ」ことには何の問題もありません;-)。friend_id4を使用します。

slug =>"123foobar"でユーザーを作成しました。このユーザーのIDは200です。

を実行するUser.find('123-foobar')と、ユーザー200ではなくID123のユーザーが返されます。

これはバグですか?

4

1 に答える 1

7

findメソッド(最初の引数がシンボルでない場合)は、主キーで検索します。スラッグを主キーにしたい場合は、次のようにします。

class User < ActiveRecord::Base
  set_primary_key :slug
end

そうすることで、findはスラッグ文字列で検索し、to_paramはスラッグから文字列を返します。パスとURLヘルパーもスラッグを使用する必要があります。外部キーもスラッグを使用する必要があります。ただし、現在、findはidで検索されません。

IDを通常どおりに機能させたい場合、および/または動作をすべて変更したくないが、スラッグがユーザーの代替検索方法である場合は、次の方法で検索します。

User.find_by_slug('123-foobar')

ルートは問題ありませんが、スラッグが:idのあるURLにある場合は、params [:id]でコントローラーに渡されます。したがって、スラッグと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"])
    ...
于 2012-05-01T11:05:56.380 に答える