2014-08-28 4 views
1

Я создаю приложение, в котором используется глобализация. Я пытаюсь добавить драгоценный камень Friendly ID для постоянных ссылок.Rails 4 + Friendly_id gem: Как сгенерировать slug с определенной строкой?

My Product таблица на самом деле нет name column. Столбец name хранится в Product::Translation, поэтому я не могу использовать настройки friendly_id :name, use: :slugged, которые они рекомендуют на странице github.

Я хочу установить постоянную ссылку на атрибут name перевода на английский язык. Это то, что я до сих пор:

before_save :update_slug 

def update_slug 
    english_translation = translations.find { |t| t.locale == :en } 
    self.slug = english_translation.name if english_translation 
end 

Однако это не преобразует переменную english_translation.name в параметре дружественном формате. Если у меня есть имя something sdfsdfs sdfsf, слиз будет таким же, и это сломает вещи, так как путь будет /products/something sdfsdfs sdfsf со всеми пробелами.

Есть ли способ, с помощью которого можно преобразовать строку в формат slug? Что-то вроде:

before_save :update_slug 

def update_slug 
    english_translation = translations.find { |t| t.locale == :en } 
    self.slug = slugify(english_translation.name) 
end 

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

+0

Почему бы не создать метод делегата под названием 'Product # name', который возвращает название перевода на английский? Или, может быть, создать метод, называемый 'Product # slug_name', который делает это? –

+0

Итак, вы говорите 'friendly_id: my_english_slug_name, используйте:: slugged' и определяете метод под названием' my_english_slug_name', который возвращает имя english_translation? – Edmund

+0

Я пробовал, и это не сработало – Edmund

ответ

3

Friendly_ID

Как Greg Burgardt сказал, ваша цель состоит в том, чтобы получить значение в friendly_id, что позволяет ему строить свой слизняка.

Ваш метод состоит в том, чтобы попытаться вручную создать атрибут slug - вы будете гораздо лучше брать значение, которое вы получаете из translation и передавая его в friendly_id. Чтобы сделать это, вот что я хотел бы сделать:

#app/models/product.rb 
class Product < ActiveRecord::Base 
    extend Friendly_ID 
    friendly_id :name, use: :slugged 

    def name 
     english_translation = translations.find { |t| t.locale == :en } 
     english_translation.name 
    end 
end 

Friendly_ID builds your slug означает, что вы не хотите, чтобы создать slug себя:

С UUID, уродливы, FriendlyId обеспечивает «слизняка кандидатов " , чтобы вы могли указать альтернативные слизни для использования в событии тот, который вы хотите использовать, уже сделан. Например:

class Restaurant < ActiveRecord::Base 
    extend FriendlyId 
    friendly_id :slug_candidates, use: :slugged 

    # Try building a slug based on the following fields in 
    # increasing order of specificity. 
    def slug_candidates 
    [ 
     :name, 
     [:name, :city], 
     [:name, :street, :city], 
     [:name, :street_number, :street, :city] 
    ] 
    end 
end 

r1 = Restaurant.create! name: 'Plaza Diner', city: 'New Paltz' 
r2 = Restaurant.create! name: 'Plaza Diner', city: 'Kingston' 

r1.friendly_id #=> 'plaza-diner' 
r2.friendly_id #=> 'plaza-diner-kingston' 

Чтобы использовать кандидатов, сделайте ваш базовый метод FriendlyId возвратом массива. Метод не следует называть slug_candidates; это может быть что угодно вы хотите. Массив может содержать любую комбинацию символов, строк, procs или lambdas и будет оцениваться лениво и в порядке. Если вы укажете символов, FriendlyId вызовет метод в вашем классе модели с таким же именем . Строки будут интерпретироваться буквально. Procs и lambdas будут вызываться, а их возвращаемые значения будут использоваться в качестве базового идентификатора . Если ни один из кандидатов не может создать уникальный слизень, , то FriendlyId добавит UUID к первому кандидату в качестве последнего курорта.

+0

Думая об этом сейчас, я бы рекомендовал создать метод 'default_name', который предполагает, что язык является английским. Тогда метод «name» мог бы выбрать перевод для «текущего языка», а для создания slug FriendlyId мог использовать метод 'default_name'. Это даст вам больше гибкости, не предполагая, что «имя» продукта должно быть на английском языке. –

3

Я думаю, ради потомства:

class Product < ActiveRecord::Base 
    friendly_id :default_slug, use: :slugged 

    def default_slug 
    english_translation = translations.find { |t| t.locale == :en } 
    english_translation.try(:name) 
    end 
end 
Смежные вопросы