RailsでscaffoldするとURLの形式はexample.com/posts/:idになります。
Cependant, il peut arriver que vous ne souhaitiez pas utiliser id pour un paramètre.
今回はexample.com/posts/:uuidの様な形式でidの代わりにuuidを設定してみました。
Ajoutez une colonne uuid lors de la création de la table.
$ rails g scaffold post uuid:string body:text
class CreatePosts < ActiveRecord::Migration[6.0]
  def change
    create_table :posts do |t|
      t.string :uuid, null: false
      t.text :body
      t.timestamps
    end
    add_index :posts, :uuid
  end
end
$ rails db:migrate
config/routes.rb
resources :posts, param: :uuid
#Lors du réglage uniquement de l'écran de détail
# get '/posts/:uuid', to: 'posts#show'
Ajoutez un processus pour définir uuid avant d'enregistrer les données.
app/models/application_record.rb
class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true
  private
  #ajouter à
  def set_uuid
    if self.has_attribute?(:uuid) && self.uuid.blank?
      self.uuid = SecureRandom.hex(10)
    end
  end
end
app/models/post.rb
class Post < ApplicationRecord
  #ajouter à
  before_create :set_uuid
end
Si vous accédez à l'écran tel quel, une erreur se produira, alors réparez le contrôleur.
app/controllers/posts_controller.rb
def set_post
  @post = Post.find_by(uuid: params[:uuid])
end
これでexample.com/posts/:uuidの形式への設定ができました。
Recommended Posts