はじめに
この記事では、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