2017-04-04 6 views
1

FriendlyIDを自分のレールアプリにインストールしました。私はこの問題https://github.com/norman/friendly_id/issues/700の指示に従い、第1のオプションに従ってこのようなリンクを変更しました。FriendlyID - 管理者ネームスペースのデフォルトIDを使用

# before: admin_post_path(@post) 
link_to admin_post_path(@post.id) 

これまでのところは良い、しかし私は、私は次のエラーを取得_formを提出しようとしたとき、私は私も削除していたので、これが発生したことを発見したいくつかのデバッグ後

Couldn't find Post with 'id'=hello-world

.friendlyメソッドは、Post.findから:

def set_post 
    # before: Post.friendly.find(params[:id]) 
    @post = Post.find(params[:id]) 
end 

だから私はすべてを取り戻すときに働いていた。あなたは

Post Load (0.3ms) SELECT `posts`.* FROM `posts` WHERE `posts`.`slug` = '1' LIMIT 1 
Post Load (0.2ms) SELECT `posts`.* FROM `posts` WHERE `posts`.`id` = 1 LIMIT 1 

を知っているようしかし、これは、ナメクジを取得するために使用される1つの余分なクエリを生成し、今ここに私の質問です:set_post@post = Post.find(params[:id])を維持し、この余分なクエリを削除する方法はありますか?親ネームスペースと親指を使ってリンクが機能するようにフロントエンドでこれを適用することを覚えておいてください。

答えて

0

FriendlyIdのfindメソッドが動作するように設計されているので、2つのクエリが表示されます。数値の文字列の場合は、最初にフレンドリーな検索を行い、次に通常の検索にフォールバックします。

the source(そして優れたコメント)を見ると、これには方法があることがわかります。idを「不公平」にすることができます。

Here's a list of things「不愉快」とみなされます。このケースでは、整数値に自分自身をparams[:id]を回すことにより、余分なクエリをドロップすることができます。

def set_post 
    @post = Post.find(params[:id].to_i) 
end 

また、あなたはまた、:id上の明示的なfind_byメソッドを使用することができます - 完全FriendlyIdファインダー・メソッドをスキップする必要があります。

+0

ルックアップ自体ではなく、生成されたリンクに問題はありませんか?つまり、実際のIDの代わりにリンクで使われているのですか? opが取得するエラーは '' id '= hello-world'でポストを見つけることができませんでした。 – Iceman

+1

@Iceman:hmm、私が理解する限りではありません。さもなければ、ログに 'slug =' 1 'が来るのを見るのではなく、代わりにスラグの値を返します。 – gwcodes

+0

いいえ、あなたは正しいと思われます。 friendly_idにも同様の問題がありました。 – Iceman

関連する問題