Невозможно изменить путь URL после обновления атрибутов с помощью friendly_id

#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