Как определить дружественные URL-адреса в Rails 3?

Теперь у меня есть что-то вроде этого

http://myapp.com/pages/1
http://myapp.com/pages/2
http://myapp.com/pages/3
http://myapp.com/pages/4

И каждая страница принадлежит одному user

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

Я думал об использовании friendly_id гем http://norman.github.com/friendly_id/, но я не найти никакого способа напрямую отредактировать слаг, чтобы установить собственный дружественный URL-адрес

как мне поступить?


person Mr_Nizzle    schedule 14.07.2011    source источник
comment
Пожалуйста, посмотрите на этот другой пост: [stackoverflow.com/questions/4995759/ Надеюсь, это поможет, [1]: stackoverflow.com/questions/4995759/   -  person Ramon Araujo    schedule 24.01.2012


Ответы (6)


FriendlyID — отличная жемчужина.

Не должно быть сложно реализовать пользовательский URL-адрес страницы. Создайте таблицу pages с user_id и link

class User < ActiveRecord::Base
  has_many :pages

class Page < ActiveRecord::Base
  belongs_to :user

  has_friendly_id :link # link is name of the column whose value will be replaced by slugged value

В page#new вы добавляете вход для атрибута link.

В качестве альтернативы вы можете установить friendly_id в заголовке или что-то еще с опцией :use_slug => true. Таким образом, FriendlyID возьмет заголовок и изменит его, чтобы в нем не было символов с ограниченным доступом. Он будет использовать собственную таблицу для хранения слагов. Используйте cached_slug для увеличения производительности.

Обновлено

Чтобы дать пользователям выбор, хотят ли они установить пользовательскую ссылку, вы можете сделать это:

  1. Установите friendly_id в поле link без слагов..
  2. Создайте виртуальный атрибут permalink, чтобы вы могли отображать его в своих формах.
  3. В фильтре before_filter проверьте, установлен ли permalink.
  4. Если да, запишите его в поле link.
  5. Если это не так, напишите заголовок в поле link.

FriendlyID использует драгоценный камень babosa для создания слагов. Если вы решите использовать и его, ваш фильтр может выглядеть так:

protected
  def generate_link
                #you might need to use .nil? instead
    self.link = self.permalink.empty? ? make_slug(self.title) : make_slug(self.permalink)
  end

  def make_slug(value)
    value.to_slug.normalize.to_s #you could as well use ph6py's way
  end
person bassneck    schedule 14.07.2011
comment
Но что, если я хочу сохранить его в одном поле, где у меня есть поле title для страницы.... Я могу использовать has_friendly_id :title, тогда я могу перейти на страницу, используя дружественный_id на основе заголовка, но я хочу дать второй вариант... что-то вроде custom_link, поэтому, когда пользователь устанавливает какое-то значение, он сначала принимает custom_link вместо friendly_id, если пользователь хочет что-то нестандартное, но заголовок страницы в URL будет ли это хорошим способом? что ты думаешь? - person Mr_Nizzle; 14.07.2011

Добавление метода to_param в одну из моделей должно помочь:

def to_param
  "#{id}-#{call_to_method_that_returns_custom_name.parameterize}"
end

Надеюсь, это то, что вы ищете :)

person user841092    schedule 14.07.2011

Я не использую гем friendly_url и не уверен, что мой способ эффективен. Но он отлично работает для меня.

У меня есть модель под названием Node с id и дружественным полем URL под названием url_title.

Мой routes.rb файл:

resource 'nodes/:url_title', :to => 'Nodes#view'

nodes_controller.rb

class NodesController <ActiveController
 def view
  @node = Node.find_by_url_title(:params(url_title))
 end
end

И используйте переменную @node для заполнения вашего представления.

Теперь, когда я набираю www.example.com/nodes/awesome-title, я попадаю на нужную страницу. Одним из аргументов против этого может быть необходимость создания индекса для неосновного поля. Но я думаю, что это может потребоваться для повышения производительности даже в геме friendly_url. Кроме того, неосновное поле url_title должно быть уникальным. Опять же, это может потребоваться даже для корректной работы с friendly_url. Не стесняйтесь поправлять меня, если я ошибаюсь в этих предположениях.

person brayne    schedule 14.07.2011

Если вы посмотрите этот скринкаст, вы все поймете тебе. Это старо, но очень актуально.

person Zach Inglis    schedule 14.07.2011

Я написал для этого сообщение, используя friendly_id 4.x. Сначала он создаст слаг на основе определенного атрибута, а затем позволит пользователю обновить его с помощью формы. Проверьте это здесь: http://fedible.org/posts/customizing-friendly_id-slugs .

person Saurabh Bhatia    schedule 23.03.2013

Есть множество способов, вы можете достичь этого-

1) с использованием Стрингекс

2) slugable-искатель

3) дружественный_id

Полную пошаговую методологию с указанием причин использования каждой из них можно найти на здесь. Приятного чтения!

person inquisitive    schedule 10.10.2014