сделать красивую ссылку через рубин - PullRequest
1 голос
/ 20 сентября 2010

Хорошо, поэтому я хочу, чтобы заголовок события был в URL, например,

/events/party-at-mikes

вот как я это делаю

Event.find_by_title(params[:title])

моя ссылка

 <%= link_to('<span>EVENTS</span>', course_event_path(obj.golf_course.city.permalink, obj.golf_course.permalink, obj.title), :class => 'right eve_bnt') %>

объект obj.title

проблема в том, что URL выглядит так

events/Party at mikes

что мне нужно сделать, это поместить пробел в пробел и найти захват, который

Ответы [ 4 ]

4 голосов
/ 20 сентября 2010

Вам действительно стоит взглянуть на камень friendly_id . Он предназначен для того, чтобы делать именно то, что вы собираетесь, и заботится о ряде крайних случаев. Основной крайний случай, который делает это немного болезненным: что если два события имеют одинаковый заголовок?

Игнорирование угловых случаев, правильный способ сделать это - перегрузить два метода вашего класса:

class Event < ActiveRecord::Base
    ...

    # This is used automatically to build the :id component of the url
    # in the form /models/:id
    def to_param
        self.title
    end

    # Now assuming that you just use Event.find(params[:id]),
    # you probably want Event.find to work differently.
    def self.find(identifier)
        self.find_by_title(identifier)
    end

    ...
end
2 голосов
/ 20 сентября 2010

Андрес предлагает переопределить to_param для использования заголовка, но это неприемлемо, так как вам не нужны пробелы и т. Д. Вам нужна постоянная ссылка или слаг для модели, хранящейся в строковом поле под названием «слаг»пример ниже.Это создается, когда запись сохраняется, и впоследствии никогда не изменяется: это используется в качестве замены для идентификатора в URL.Слаг содержит только буквы, цифры и дефисы и может быть уникальным путем добавления цифр в конце.Затем вы изменяете to_param на использование slug, и вы обнаруживаете slug в своем контроллере.Например,

before_create :set_slug

def set_slug
  slug = self.title.downcase.gsub(/[^a-z0-9]/,"-")
  suffix = ""
  while self.class.find_by_slug(slug)
    slug.gsub!(/#{suffix}$/,(suffix == "" ? 1 : suffix+=1).to_s) 
  end
  self.slug = slug
end

def to_param
  self.slug
end

В вашем контроллере событий

  before_filter :load_event, :except => [:index, :new]
...
protected
  def load_event
    @event = Event.find_by_slug(params[:id])
  end
1 голос
/ 21 сентября 2010

Я бы определенно пошел по пути сохранения идентификатора в URL вместе с дружественным именем, прикрепленным к нему. Это облегчает отладку, если у вас плохая запись, и ее легко реализовать. Не говоря уже о том, что sql может найти int намного быстрее, чем varchar.

Просто добавь это в свою модель. Нет необходимости определять метод забивания, так как он предоставляется в рельсах уже через параметризацию. Это также имеет то преимущество, что требует 0 изменений в вашем другом коде. Это будет работать практически во всех ситуациях из коробки.


  # Slug the url.
  def to_param
    "#{id}-#{title.parameterize}"
  end
1 голос
/ 20 сентября 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...