2017-02-07 56 views
0

У меня уже установлена ​​Friendly Id, следуя всем инструкциям от Home page.Использование дружественного идентификатора для создания значимых URL-адресов для похожих имен с разными значениями слизняков. Rails 4

Короче говоря, я добавил колонку module и slug в моей Место модели таблицы.

в моем place.rb

extend FriendlyId 
    friendly_id :name, use: [:slugged, :finders, :history] 

Я побежал Place.find_each(&:save).

Теперь значение name может быть другим, так как есть много мест с одинаковыми именами. Так что в действии индекса, когда я вызываю действие show, используя id, я получаю правильные результаты, но URL-адреса выглядят плохо, однако, когда i вызывать действие show с использованием friendly_id, url здесь тоже плохо с его токеном uniq, как и прикрепленная строка, а также я всегда получаю неправильный результат.

например. Для записи с name значение как Бурвуд, может быть несколько записей too.However, есть две проблемы: -

  1. Мои URLs должны быть как www.mysite/sydney/burwood вместо www.mysite/sydney/21, если я использую id и не friendly_id (что выглядит странно - www.mysite/sydney/burwood-78894aa3-dea1-4915-b2f7-038182511005), Как справиться с этим. ??
  2. Если я Dont использовать Id и использовать friendly_id в качестве параметра URL-адреса, для подобных мест значения Бурвуда, я всегда получаю первую запись, даже если я с просьбой о других one.So в БДЕ, name значения burwood, имеющими две записи, мои ценности пуль разные - burwood и burwood-78894aa3-dea1-4915-b2f7-038182511005

Таким образом, если использовать идентификатор в качестве параметра URL-адреса, он работает как идентификаторы являются уником и слизни не рассматривается, но я хочу, чтобы URL быть более значимым.

Однако, если я использую friendly_id, url выглядит странно, а также уникальная запись не подбирается.

Просьба помочь

ответ

0

Если есть много мест, с тем же именем, то friendly_id добавит GUID, к концу заготовки, чтобы сделать его уникальным.

Вы можете попробовать использовать friend_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 

https://github.com/norman/friendly_id

В качестве альтернативы вы можете свернуть свой собственный слизняка путем переопределения to_param в Place модели и используя before_validation фильтр для установки слизняка.

before_validation :format_slug 

def to_param 
    slug 
end 

private 

def format_slug 
    self.slug = "#{name} #{id}".parameterize 
    # You can define any rules for your slug here. 
end 

И если вы хотите Params [: ID] читать Params [:] слизняка в контроллере вместо, а затем установить param: :slug в маршрутах.

resources :places, param: :slug 

И в контроллерах:

Place.find_by(slug: params[:slug]) 
+0

я могу добиться этого с помощью to_param, но как я могу сделать мои URLs довольно .Я не хочу, чтобы показать мой Id в URL-адреса ... – Milind

+0

Вы? может добавить столбец 'guid' и создать уникальный идентификатор с помощью' SecureRandom.hex (4) 'для создания случайной уникальной строки/id. Длина будет в два раза больше, поэтому 8 символов длиннее, если мы используем значение 4. – codyeatworld

+0

Я могу добавить пример, если вы хотите. – codyeatworld