···1+# FriendlyId Global Configuration
2+#
3+# Use this to set up shared configuration options for your entire application.
4+# Any of the configuration options shown here can also be applied to single
5+# models by passing arguments to the `friendly_id` class method or defining
6+# methods in your model.
7+#
8+# To learn more, check out the guide:
9+#
10+# http://norman.github.io/friendly_id/file.Guide.html
11+12+FriendlyId.defaults do |config|
13+ # ## Reserved Words
14+ #
15+ # Some words could conflict with Rails's routes when used as slugs, or are
16+ # undesirable to allow as slugs. Edit this list as needed for your app.
17+ config.use :reserved
18+19+ config.reserved_words = %w[new edit index session login logout users admin
20+ stylesheets assets javascripts images]
21+22+ # This adds an option to treat reserved words as conflicts rather than exceptions.
23+ # When there is no good candidate, a UUID will be appended, matching the existing
24+ # conflict behavior.
25+26+ # config.treat_reserved_as_conflict = true
27+28+ # ## Friendly Finders
29+ #
30+ # Uncomment this to use friendly finders in all models. By default, if
31+ # you wish to find a record by its friendly id, you must do:
32+ #
33+ # MyModel.friendly.find('foo')
34+ #
35+ # If you uncomment this, you can do:
36+ #
37+ # MyModel.find('foo')
38+ #
39+ # This is significantly more convenient but may not be appropriate for
40+ # all applications, so you must explicitly opt-in to this behavior. You can
41+ # always also configure it on a per-model basis if you prefer.
42+ #
43+ # Something else to consider is that using the :finders addon boosts
44+ # performance because it will avoid Rails-internal code that makes runtime
45+ # calls to `Module.extend`.
46+ #
47+ # config.use :finders
48+ #
49+ # ## Slugs
50+ #
51+ # Most applications will use the :slugged module everywhere. If you wish
52+ # to do so, uncomment the following line.
53+ #
54+ # config.use :slugged
55+ #
56+ # By default, FriendlyId's :slugged addon expects the slug column to be named
57+ # 'slug', but you can change it if you wish.
58+ #
59+ # config.slug_column = 'slug'
60+ #
61+ # By default, slug has no size limit, but you can change it if you wish.
62+ #
63+ # config.slug_limit = 255
64+ #
65+ # When FriendlyId can not generate a unique ID from your base method, it appends
66+ # a UUID, separated by a single dash. You can configure the character used as the
67+ # separator. If you're upgrading from FriendlyId 4, you may wish to replace this
68+ # with two dashes.
69+ #
70+ # config.sequence_separator = '-'
71+ #
72+ # Note that you must use the :slugged addon **prior** to the line which
73+ # configures the sequence separator, or else FriendlyId will raise an undefined
74+ # method error.
75+ #
76+ # ## Tips and Tricks
77+ #
78+ # ### Controlling when slugs are generated
79+ #
80+ # As of FriendlyId 5.0, new slugs are generated only when the slug field is
81+ # nil, but if you're using a column as your base method can change this
82+ # behavior by overriding the `should_generate_new_friendly_id?` method that
83+ # FriendlyId adds to your model. The change below makes FriendlyId 5.0 behave
84+ # more like 4.0.
85+ # Note: Use(include) Slugged module in the config if using the anonymous module.
86+ # If you have `friendly_id :name, use: slugged` in the model, Slugged module
87+ # is included after the anonymous module defined in the initializer, so it
88+ # overrides the `should_generate_new_friendly_id?` method from the anonymous module.
89+ #
90+ # config.use :slugged
91+ # config.use Module.new {
92+ # def should_generate_new_friendly_id?
93+ # slug.blank? || <your_column_name_here>_changed?
94+ # end
95+ # }
96+ #
97+ # FriendlyId uses Rails's `parameterize` method to generate slugs, but for
98+ # languages that don't use the Roman alphabet, that's not usually sufficient.
99+ # Here we use the Babosa library to transliterate Russian Cyrillic slugs to
100+ # ASCII. If you use this, don't forget to add "babosa" to your Gemfile.
101+ #
102+ # config.use Module.new {
103+ # def normalize_friendly_id(text)
104+ # text.to_slug.normalize! :transliterations => [:russian, :latin]
105+ # end
106+ # }
107+end
+6-9
config/routes.rb
···1Rails.application.routes.draw do
2- get 'tags/index'
3- get 'tags/create'
4- resources :galleries
5 # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html
67 # Reveal health status on /up that returns 200 if the app boots with no exceptions, otherwise 500.
···13end
1415Rails.application.routes.draw do
16- get 'tags/index'
17- get 'tags/create'
18 get "/tags", to: "tags#index"
019 get "tags/:id" => "tags#show", as: :tag
00002021- resources :galleries
22 get "/articles", to: "articles#index"
23-# get 'tags/:tag', to: 'articles#index', as: "tag"
24 # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
25end
2627Rails.application.routes.draw do
28- resources :galleries
29 get "/users", to: "users#index", via: "get"
30end
3132Rails.application.routes.draw do
33- resources :galleries
34 root "articles#index"
3536 resources :profiles
···1Rails.application.routes.draw do
0002 # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html
34 # Reveal health status on /up that returns 200 if the app boots with no exceptions, otherwise 500.
···10end
1112Rails.application.routes.draw do
0013 get "/tags", to: "tags#index"
14+# get "tags/:edit" => "tags#edit", as: :edit_tag_path
15 get "tags/:id" => "tags#show", as: :tag
16+ get "tags/:new" => "tags#new"
17+# resources :tag, path: '', only: [:show]
18+ resources :tags
19+end
2021+Rails.application.routes.draw do
22 get "/articles", to: "articles#index"
023 # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
24end
2526Rails.application.routes.draw do
027 get "/users", to: "users#index", via: "get"
28end
2930Rails.application.routes.draw do
031 root "articles#index"
3233 resources :profiles
+38-3
test/controllers/tags_controller_test.rb
···1require "test_helper"
23class TagsControllerTest < ActionDispatch::IntegrationTest
00004 test "should get index" do
5- get tags_index_url
0000000000000000006 assert_response :success
7 end
89- test "should get create" do
10- get tags_create_url
11 assert_response :success
000000000000012 end
13end
···1require "test_helper"
23class TagsControllerTest < ActionDispatch::IntegrationTest
4+ setup do
5+ @tag = tags(:one)
6+ end
7+8 test "should get index" do
9+ get tags_url
10+ assert_response :success
11+ end
12+13+ test "should get new" do
14+ get new_tag_url
15+ assert_response :success
16+ end
17+18+ test "should create tag" do
19+ assert_difference("Tag.count") do
20+ post tags_url, params: { tag: { name: @tag.name, slug: @tag.slug } }
21+ end
22+23+ assert_redirected_to tag_url(Tag.last)
24+ end
25+26+ test "should show tag" do
27+ get tag_url(@tag)
28 assert_response :success
29 end
3031+ test "should get edit" do
32+ get edit_tag_url(@tag)
33 assert_response :success
34+ end
35+36+ test "should update tag" do
37+ patch tag_url(@tag), params: { tag: { name: @tag.name, slug: @tag.slug } }
38+ assert_redirected_to tag_url(@tag)
39+ end
40+41+ test "should destroy tag" do
42+ assert_difference("Tag.count", -1) do
43+ delete tag_url(@tag)
44+ end
45+46+ assert_redirected_to tags_url
47 end
48end