LoginSignup
1
1

More than 3 years have passed since last update.

RailsでURLをランダム文字列にする方法

Posted at

はじめに

この記事では、RailsでURLをランダム文字列にする方法をご紹介します。
よくUserモデルを作って、Userのプロフィールを表示するのにURLをhttps://~~~.com/users/1のようにidをそのままにして使用していると思います。

このidの部分をランダムな文字列にして実装しようと思います!

前提:Railsの環境構築が終わっている

URL用のカラムを追加する

ここではUserモデルを使って説明していきます^^
まず、UserテーブルにURL用のカラムをターミナルで追加します。
URLのカラム名としてurl_tokenを指定しました。ここにidの代わりに使用するランダム文字列を入れます。

$ rails generate migration add_url_token_to_users url_token:string
$ rails db:migrate

忘れずにmigrateもしましょう!!

routesにparams: :url_tokenを追記する

resouceを使っていることを前提とすると、下記のようになります。
resouceを使っていないのであれば、おそらくget 'users/show/:id' => "users#show", param: :url_tokenで動くのではないかと思います。(動作確認しておりません)

# config/routes.rb
resources :users, param: :url_token

Userモデルにto_paramを追加する

to_paramはリソースのユニークなURLを発行する時に使うものです。
この中にどのカラムをURLに使うか指定します。ここでは、url_tokenですが、例えばnameとかも指定できます。

# app/models/user.rb
class User < ApplicationRecord
  validates :url_token, presence: true, uniqueness: true

  def to_param
    url_token
  end
end

コントローラーでUserの取得方法を変更する

以前まではUserを取得する時idを指定して取得していたとします。ここでは【前】の部分のコードになります。
【次】がurl_tokenを指定して、Userを取得する場合のコードになります。
取得方法は【前】と似ていますね^^
使い方に関しては問題ないかと思います。

# app/controllers/user_controller.rb
【前】
class UserController < ApplicationController
  def show
    user = User.find(params[:id])
  end
end

【次】
class UserController < ApplicationController
  def show
    user = User.find_by(url_token: params[:url_token])
  end
end

Userモデルのurl_tokenのランダム初期値を設定する

またモデルに戻って、url_tokenのデフォルト値をランダムに設定します。

class User < ApplicationRecord
  attribute :url_token, :string, default: SecureRandom.hex(10)

  validates :url_token, presence: true, uniqueness: true

  def to_param
    url_token
  end
end

終わりに

以上が、RailsでURLをランダム文字列に設定する方法でした!
Railsに慣れてくると、少しずつ視野が広くなって、どんどん楽しくなっていきますね!
Twitterでも、技術に関することを毎日発信してるので、よろしければフォローしてください^^
Twitter → https://twitter.com/TakeshiOnaga

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1