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