Слаг friendly_id не меняется при обновлении

Я использую friendly_id 5.0.0.rc1, а также active_admin.

Казалось бы, все работает отлично, как и ожидалось, за исключением того факта, что обновление атрибута/столбца записи slug в active_admin ничего не делает (оно остается прежним)

Я нахожу то же самое поведение, просто используя консоль:

p = Post.first
p.slug
#=> 'test'
p.slug = 'another-test'
p.save
#=> true
p.slug
#=> 'test

Моя конфигурация:

FriendlyId.defaults do |config|
  config.use :reserved

  config.reserved_words = %w(admin new edit index session users register)

  config.use :finders

  config.use :slugged

  config.slug_column = 'slug'

  config.sequence_separator = '-'

  config.use Module.new {
    def should_generate_new_friendly_id?
      slug.blank? || slug_changed?
    end
  }
end

Моя модель:

class Post < ActiveRecord::Base

  default_scope { order('created_at DESC') }

  validates :title, presence: true
  validates :body,  presence: true
  validates :views, presence: true, numericality: { only_integer: true }

  extend FriendlyId
  friendly_id :title, use: [:slugged, :history]

end

мой контроллер:

class PostsController < ApplicationController

  def index
    @posts = Post.all.page(params[:page]).per(10)
  end

  def show
    @post = Post.find_by_slug!(params[:id])

    if request.path != post_path(@post)
      redirect_to @post, :status => :moved_permanently and return
    else
      @post.increment :views if @post
    end

  end

end

Спасибо!


person Tallboy    schedule 28.09.2013    source источник
comment
Возможно, я ошибаюсь, но в вашей конфигурации указано, что при изменении столбца слагов он должен генерировать новый слаг. Итак, если вы вручную измените значение столбца slug и сохраните запись, я предполагаю, что процесс генерации запускается, что приводит к старому slug, поскольку заголовок не изменился!?   -  person Vapire    schedule 29.09.2013
comment
Чтобы ответить на ваш вопрос: он не срабатывает. А по умолчанию объясняют обратное. Итак, вам нужно, чтобы ваш def должен_генерировать_новый_дружественный_ид? в каждой модели.   -  person Ben    schedule 10.11.2014


Ответы (3)


Обычно при использовании дружественного идентификатора вы никогда не обновляете слаг вручную. Вместо:

def should_generate_new_friendly_id?
  slug.blank? || title_changed?
end

И тогда каждый раз, когда вы меняете заголовок, он будет автоматически обновлять слаг.

person AJcodez    schedule 29.09.2013
comment
Часть config.use Module.new{ }, расположенная в конфигурационном файле (что, очевидно, помешает вам повторять метод should_generate_new_friendly_id в каждой модели), просто игнорируется. Очень вводит в заблуждение, так как это хорошо объяснено в конце файла конфигурации по умолчанию. - person Ben; 10.11.2014
comment
Что-то я тут не понимаю... Что же нового? Я хотел бы знать. Это все еще объясняется в их конфигурационном файле по умолчанию. - person Ben; 10.11.2014
comment
@Бен, чувак, если тебе не нравится ответ, отредактируй его. Это все, что я имел в виду. Я больше не использую FriendlyId или Rails. - person AJcodez; 10.11.2014
comment
моя вина; то, что я имел в виду, вводило в заблуждение, это friendly_id, а не ваш ответ. Ведь они и так это объясняют. Что бы вы порекомендовали использовать? - person Ben; 10.11.2014
comment
@Бен, понял. Хм, обычно только несколько моделей нуждаются в friendly_id, поэтому вы должны указывать каждый раз в модели (обычно разные поля составляют слаг). - person AJcodez; 10.11.2014

точнее, вы должны использовать self.title_changed?

def should_generate_new_friendly_id?
  slug.blank? || self.title_changed?
end
person Tan    schedule 29.01.2016
comment
self необходим, когда мы используем его для setter, а для getter мы можем использовать его с/без self - person Sampat Badhe; 07.02.2016

Если кто-то еще приземлится здесь, и ему просто нужно изменить слаг:

p = Post.first
p.slug
#=> 'test'
tmp_title = p.title
p.title = 'another-test'
p.slug = nil
p.save
#=> true
p.title = tmp_title
p.slug
#=> 'another-test'
person user1881102    schedule 06.03.2021