Как определить удобные для пользователя URL-адреса в Rails 3? - PullRequest
2 голосов
/ 14 июля 2011

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

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

как мнепродолжить?

Ответы [ 6 ]

3 голосов
/ 14 июля 2011

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 gem для генерации слагов.Если вы решите использовать его, вот как может выглядеть ваш фильтр:

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
2 голосов
/ 14 июля 2011

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

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

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

0 голосов
/ 10 октября 2014

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

1) с использованием Stringex

2) плавник-искатель

3) friendly_id

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

0 голосов
/ 23 марта 2013

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

0 голосов
/ 15 июля 2011

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

0 голосов
/ 15 июля 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. Не стесняйтесь поправлять меня, если я ошибаюсь в этих предположениях.

...