Rails , Slug, URL- slug-URL, :
1.
friendly_id sequentially_slugged , ( , before_validation.
Rails :
rails new .
friendly_id Gemfile ( bundle install ):
gem 'friendly_id'
slugs ( rake db:migrate after), db/migrate/20170114211811_create_slugs.rb:
class CreateSlugs < ActiveRecord::Migration
def change
create_table :slugs do |t|
t.string :url
t.string :title
end
add_index :slugs, :url, unique: true
add_reference :slugs, :item, polymorphic: true, index: true
end
end
Slug, friendly_id, app/models/slug.rb:
class Slug < ActiveRecord::Base
extend FriendlyId
friendly_id :title,
use: :sequentially_slugged,
slug_column: :url
belongs_to :item, polymorphic: true
end
2. +
(, /this-is-my-x).
config/routes.rb:
Rails.application.routes.draw do
get ':url' => 'slugs#show'
end
Slug, Slug render , Slug Model.
app/controllers/slugs_controller.rb:
class SlugsController < ApplicationController
def show
@item = Slug.find_by(url: params[:url])
render "#{@item.item_type.pluralize.underscore}/show"
end
end
3. Sluggable Models + Views
, Slug .
Article + :
rails generate model article title:string
app/models/article.rb:
class Article < ActiveRecord::Base
has_one :slug, as: :item
before_validation do
if slug.try(:title) != title
self.slug = Slug.create(title: title)
end
end
end
app/views/articles/show.html.erb:
<h1>Articles#show</h1>
<p>Title is <%=@item.title%>, ID is <%=@item.id%></p>
+ , ..
4.
rails console:
(1..10).each { Article.create title: 'foo' }
( rails server localhost:3000/foo-7):
Articles
Title is foo, ID is 7
!