2014-08-19 2 views
3

Я использую драгоценный камень friendly_id. В portfolio.rb я поместил эти две строки:Изменение уникальных названий с именами friendly-id

extend FriendlyId 
    friendly_id :title, use: :slugged 

Как вы можете видеть, я также с помощью опции слизняка. Когда я создаю проект с названием «пример», он работает, и я могу найти проект под mysite.com/projects/example. Теперь, если я создаю второй с тем же названием, я получаю заголовок для него, как этот: mysite.com/projects/example-74b6c506-5c61-41a3-8b77-a261e3fab5d3. Мне не нравится этот титул. Я надеялся на более дружелюбный титул вроде example-2.

При этом question, RSB (пользователь) сказал мне, что его friendly_id вызывает это. Мне было интересно, есть ли способ создать более дружественный. Сначала я подумал о том, что «вручную» проверяет, существует ли один и тот же заголовок (в цикле while) и назначает другой заголовок, используя пример-2 или пример-3 или ... пример-N.

Однако мне нужно что-то делать, или я чего-то не хватает? Есть ли более простой способ сделать что-то подобное?

ответ

4

Проверьте documentation для последней версии friendly_id:

Новая функциональность «кандидаты», которая позволяет легко создать список альтернативных слизней, которые могут быть использованы, чтобы однозначно отличить записи, а не добавляется последовательность.

Пример прямо из документации:

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 
+0

Это правильно, я думаю, хотя не по причинам, чем вопрос! –

+0

Удивительный! Спасибо, что поделился! Он также может использоваться как решение! –

+0

@RichPeck Не уверен, что вы имеете в виду? Вопрос заключается в том, как создать более дружественный пул для дубликатов. Это отвечает на него, в общем, нет? – Thilo

3

UUID

Проблема вы намекая на путь, в котором friendly-id appends a hash (они называют это UUID), чтобы дублировать записи:

Теперь, когда кандидаты были добавлены, FriendlyId больше не использует , чтобы различать конфликтующий пул, а UUID (например, что-то вроде 2bc08962-b3dd-4f29-b2e6-244710c86106). Это делает кодовой базой более простой и надежной при одновременном запуске, при за счет получения более слабых идентификаторов при возникновении конфликтов.

Я не понимаю, почему они сделали это, так как это идет вразрез с мантрой дружной ID, но, тем не менее, вы должны понимать, что, как это работает. И хотя я не думаю, что slug_candidates выше метод окажется более успешным, я делать думает, что вы будете в состоянии использовать что-то вроде custom method определить слизняк вы хотите

-

Вам нужно будет read this documentation (very informative)

В нем говорится, что существует два способа определить «слизень» ваших записей, назначаемых либо с помощью пользовательского метода, либо путем переопределения метода normalize_friendly_id.Вот моя интерпретация обоих из них для вас:

Пользовательский метод

#app/models/project.rb 
Class Project < ActiveRecord::Base 
    extend FriendlyID 
    friendly_id :custom_name, use: :slugged 

    def custom_name 
    name = self.count "name = #{name}" 
    count = (name > 0) ? "-" + name : nil 
    "#{name}#{count}" 
    end 
end 

Normalize_Friendly_ID

#app/models/project.rb 
Class Project < ActiveRecord::Base 
    extend FriendlyID 
    friendly_id :name, use: :slugged 

    def normalize_friendly_id 
    count = self.count "name = #{name}" 
    super + "-" + count if name > 0 
    end 
end 
+0

Использование UUID предотвращает конфликты, возникающие при объединении баз данных (что может происходить регулярно, когда веб-приложение достаточно велико для распространения на нескольких серверах + базы данных). Хотя это только мое личное предположение, я считаю, что это стало причиной того, что команда friendly_id изменила поведение конфликтного режима, чтобы использовать UUID – Qqwy

Смежные вопросы