Посмотреть сообщение без использования первичного ключа - PullRequest
2 голосов
/ 09 февраля 2012

Чтобы получить определенный пост в моем контроллере, вы можете напечатать что-то вроде этого в URL-адресе

http://0.0.0.0:3000/post/1
http://0.0.0.0:3000/post/2
http://0.0.0.0:3000/post/3

Меня просят сделать это так, чтобы его нельзя было получить таким способом, но со случайнымстрока.Например, что-то более похожее на это:

http://0.0.0.0:3000/post/wr4t-d2e2-1ee3
http://0.0.0.0:3000/post/prst-3r4t-1r1r
http://0.0.0.0:3000/post/asdo-2e12-sxas

Вопрос Чтобы сделать это, я должен создать еще один столбец в таблице записей под названием «токен» или «случайный» и использовать этот столбец с помощьюfind_by, чтобы получить сообщение?т.е. Post.find_by_token ('wr4t-d2e2-1ee3')

Любые мнения о том, как правильно с этим справиться.Я читал примеры, когда приложения будут использовать 'суррогатный ключ' , 'guid' , 'естественный ключ' , токен , random

Я просто немного ошеломлен тем, что такое лучшая практика.

Ответы [ 2 ]

2 голосов
/ 09 февраля 2012

Вы можете проверить гем friendly_id. https://github.com/norman/friendly_id.

RailsCast: http://railscasts.com/episodes/314-pretty-urls-with-friendlyid

Вам потребуется столбец token, который, если вы используете Devise, может генерироваться с помощью метода Devise.friendly_token.

2 голосов
/ 09 февраля 2012

То, что вы ищете, это:

   class Post < ActiveRecord::Base
     # Permalinks
     #-----------------------------------------------------------------------------
     def to_param
        "#{post.token}"
     end
   end

URL будут генерироваться как

post_url(@post)
#http://0.0.0.0:3000/post/wr4t-d2e2-1ee3

Тогда вы можете делать как обычно

Post.find(params[:id])

ВыВы можете сгенерировать свой токен, просто используя обратный вызов before_validation.

ИЛИ

Вы можете получить драгоценный камень и использовать friendly_id , который будет обрабатывать это для вас, а также отслеживать историюслизняки, которые генерируются.То есть звучит так, что это, вероятно, излишне для твоих требований.

...