githubで質問しましたが、ここでも質問してみます。「機知に富んだ」ことには何の問題もありません;-)。friend_id4を使用します。
slug =>"123foobar"でユーザーを作成しました。このユーザーのIDは200です。
を実行するUser.find('123-foobar')
と、ユーザー200ではなくID123のユーザーが返されます。
これはバグですか?
githubで質問しましたが、ここでも質問してみます。「機知に富んだ」ことには何の問題もありません;-)。friend_id4を使用します。
slug =>"123foobar"でユーザーを作成しました。このユーザーのIDは200です。
を実行するUser.find('123-foobar')
と、ユーザー200ではなくID123のユーザーが返されます。
これはバグですか?
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"])
...