#ruby-on-rails #friendly-id
#ruby-on-rails #friendly-id
Вопрос:
Я следил за руководством Railscast о том, как реализовать friendly_id, и по какой-то причине мой URL-адрес не меняется после обновления моих атрибутов.
Допустим, я зарегистрировал пользователя с:fullname ‘John Doe’, он успешно создает slug / john-doe. Однако, если я обновлю свое имя до ‘Test user’, URL-адрес по-прежнему будет / john-doe
Моя текущая настройка такова:
users_controller
def show
@user = User.friendly.find(params[:id])
end
модель — user.rb
extend FriendlyId
friendly_id :fullname, use: [:slugged, :history]
Я также перенес
class AddSlugsToUsers < ActiveRecord::Migration
def change
add_column :users, :slug, :string
add_index :users, :slug, unique: true
end
end
так что это работает. Также установлен
rails generate friendly_id
и готово:
User.find_each(amp;:save)
в rails c
Что я делаю не так?
Ответ №1:
friendly_id
Это обычная проблема с friendly_id — по умолчанию устанавливается значение slug
only, если slug
атрибут пустой:
Документация
Начиная с FriendlyId 5.0, слаги генерируются только тогда, когда поле слага равно нулю. Если вы хотите, чтобы слаг был восстановлен, установите для поля slug значение nil:
restaurant.friendly_id # joes-diner
restaurant.name = "The Plaza Diner"
restaurant.save!
restaurant.friendly_id # joes-diner
restaurant.slug = nil
restaurant.save!
restaurant.friendly_id # the-plaza-diner
Вы также можете переопределить #should_generate_new_friendly_id ? метод, который позволяет точно контролировать, когда устанавливаются новые дружественные идентификаторы:
class Post < ActiveRecord::Base
extend FriendlyId
friendly_id :title, :use => :slugged
def should_generate_new_friendly_id?
title_changed?
end
end
Если вы хотите расширить поведение по умолчанию, но, добавив свои собственные условия, не забудьте вызвать super из своей реализации:
class Category < ActiveRecord::Base
extend FriendlyId
friendly_id :name, :use => :slugged
def should_generate_new_friendly_id?
name_changed? || super
end
end
Для вас я бы рекомендовал:
#app/models/user.rb
Class User < ActiveRecord::Base
...
def should_generate_new_friendly_id?
name_changed? || super
end
end
Комментарии:
1. это сработало. Однако я хочу сделать перенаправление 301 на старые URL-адреса, и я попытался добавить def show @user = User.friendly.find(параметры [:id]) при запросе. path != user_path(@user) перенаправляет на @user, status: :moved_permanently end end, но получил неопределенный метод `user_path’. Файл show (страница профиля) хранится внутри ‘users / show.html.erb’, так почему этот путь не работает? Мои маршруты настроены следующим образом: get ‘/ intern/:id’, to: ‘users#show’
2. Вам нужно будет включить
history
опцию вfriendly_id
— это создаст вызываемую таблицуfriendly_id_slugs
, в которой будут храниться исторические данные (которые будут перенаправляться автоматически)3. Я сделал: friendly_id :slug_candidates , используйте: [:slugged, :history] # Попробуйте создать slug на основе следующих полей в порядке возрастания специфичности. def slug_candidates [:fullname, [:fullname, :id] ] end и я сгенерировал таблицу friendly_id, но я хочу, чтобы она перенаправляла URL-адрес, поэтому, если я перейду в /rich-1 и изменю его на rich-2 и посещу rich-2, он должен перенаправить вас на rich-2. Если это имеет смысл?
4. Вы пытались перезапустить свой Rails-сервер/
5. теперь он работает с: friendly_id :slug_candidates, используйте: [:slugged, :history] def slug_candidates [ :полное имя, [:полное имя, Random.new.rand(1..100)] ] end