Ruby on Rails friendly_id, babosa гемы, проблема с транслитерацией

333 views
Skip to first unread message

Вячеслав Изотоп

unread,
Jan 27, 2016, 7:34:58 AM1/27/16
to RubyOnRails to russian
Использую гемы friendly_id,babosa.

Модель models/product.rb:

class Product < ActiveRecord::Base
   extend
FriendlyId
   friendly_id
:name, use: [:slugged, :finders]
   has_many
:tags


   
def normalize_friendly_id(input)
    input
.to_s.to_slug.normalize(transliterations: :russian).to_s
   
end

end


Запускаю консоль, чтобы заполнить slug поле уже имеющихся строк:

Product.find_each(&:save)

Проверяю последний товар:

Product.last
#<Product id: 4972, name: "ВА 47-63, 2P 2А (C) EKF", created_at: "2016-01-27 11:32:39", updated_at: "2016-01-27 11:32:39", slug: 04b4aa2d-2bb9-46f9-8d49-cbb9d0c3f872">

Как можно увидеть, слаг сгенерировался без транслитерации, плюс непонятный хвост.

Пробую вручную выполнить в консоли:

"ВА 47-63, 2P 2А (C) EKF".to_s.to_slug.normalize(transliterations: :russian).to_s
=> "va-47-63-2p-2a-c-ekf"


На выводе адекватная транслитерация соответствующая ожиданиям.

Не могу понять почему в консоли транслитерация норм, а через normalize_friendly_id кривая. Я новичок, поэтому мог что то просто не сделать, хотя делал всё по мануалам.

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

models/tag.rb

class Tag < ActiveRecord::Base
  extend
FriendlyId
  friendly_id
:name, use: [:slugged, :finders]
  belongs_to
:product


 
def normalize_friendly_id(input)
   input
.to_s.to_slug.normalize(transliterations: :russian).to_s
 
end
end

Сергей Цветков

unread,
Jan 27, 2016, 9:08:05 AM1/27/16
to RubyOnRails to russian
Привет.

С большим удовольствием вам помогу, как один из мейнтейнеров friendly_id, но лучше все-таки предоставить более или менее воспроизводимый пример, который проще понять. Вас примерно это же попросили прояснить и в комментариях к вопросу на Stack Overflow =)

Как основу можете использовать этот шаблон:

begin
  require 'bundler/inline'
rescue LoadError => e
  $stderr.puts 'Bundler version 1.10 or later is required. Please update your Bundler'
  raise e
end

gemfile(true) do
  gem 'activerecord', '4.2.5'
  gem 'sqlite3'
  gem 'friendly_id', '~> 5.1.0', :require => false
end

require 'active_record'
require 'minitest/autorun'
require 'logger'
require 'friendly_id'

# This connection will do for database-independent bug reports.
ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: ':memory:')
ActiveRecord::Base.logger = Logger.new(STDOUT)

ActiveRecord::Schema.define do
  create_table :posts, force: true  do |t|
    t.string :title
    t.string :slug
  end

  create_table :friendly_id_slugs do |t|
    t.string   :slug,           :null => false
    t.integer  :sluggable_id,   :null => false
    t.string   :sluggable_type, :limit => 50
    t.string   :scope
    t.datetime :created_at
  end

  add_index :friendly_id_slugs, :sluggable_id
  add_index :friendly_id_slugs, [:slug, :sluggable_type], length: { slug: 140, sluggable_type: 50 }
  add_index :friendly_id_slugs, [:slug, :sluggable_type, :scope], length: { slug: 70, sluggable_type: 50, scope: 70 }, unique: true
  add_index :friendly_id_slugs, :sluggable_type
end

FriendlyId.defaults do |config|
  config.use :slugged
  config.use :finders
  config.use :history
end

class Post < ActiveRecord::Base
  extend FriendlyId

  friendly_id :title

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

class BugTest < Minitest::Test
  def test_association_stuff
    post = Post.create!(:title => "Post")
    assert_equal post.slug, "post"
  end
end


Поменяйте его так, чтобы он демонстрировал, какое поведение вас не устраивает. Запустить можно, сохранив как скрипт, командой ruby <имя файла>.

С уважением,
Сергей Цветков.

среда, 27 января 2016 г., 15:34:58 UTC+3 пользователь Вячеслав Изотоп написал:

Хулия Паукофф

unread,
Mar 2, 2016, 7:26:10 AM3/2/16
to RubyOnRails to russian
string.to_slug.normalize(transliterations: :russian).to_s
если еще актуально
Reply all
Reply to author
Forward
0 new messages