rails
Pocket

Qiitaの記事などで見るURLの最後をランダムな文字列をURLにするやつをやってみました。

こんなやつ

http://example.com/samples/2710cd59e314a141b947

idの連番だとURL予測できて何かやられる可能性もあるのかと思って真似してみました。

FriendlyId

FriendlyIdというgemを使いました。FriendlyIdはURLのパラメーターをidではなく他のカラムにできるものです。

FriendlyId

idではないカラムにすることで、ユーザー名をURLの最後に含めたり、イベント名を含めたり、いろいろな使い方がありそうです。今回はランダムな文字列のカラムを作って、それをURLに適用するようにしてみました。

インストール

gemファイルに以下を追記し「bundle install」

gem 'friendly_id'

モデル・コントローラーの修正

rails generateやカラム追加などして、ランダム文字列用のカラムを作っておきます。

rails g scaffold Post name:string random:string

Postモデルに以下を追記

class Post < ActiveRecord::Base
  include FriendlyId
  friendly_id :random
end

posts_controller.rbでは以下のように書き換えます。

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

これで、randomカラムがURL最後につくidの代わりになりましたが、ランダム文字列をPost保存時に自動で生成して、保存するようにします。

Postモデルにさらに追記

class Note < ApplicationRecord
  include FriendlyId
  friendly_id :random

  before_create do
    self.random = SecureRandom.hex(10)
  end
end

railsはbefore_createを使うとcreateする前に実行してくれるんですね。便利。

ランダムの文字列を生成するのはこちらを参考にしました。

クラスの継承リスト: SecureRandom

Ruby 2.4.0 リファレンスマニュアル

これでできたはず。

さいごに

今回のはかなり簡易的になので、本当はユニークにしたり、文字数制限を設けたり、もっといろいろしないとダメだと思いますが、ざっとこんな感じということで。

参考にしたサイト

friendly_idについて

Qiita @reizist

Rails等でURLにランダムな文字列を使いたい時のアレ

Qiita @ainame
Pocket

Category : Tag :