Настройте URL пользователя с именем пользователя в нем, но без связи модели - PullRequest
0 голосов
/ 07 апреля 2011

Использование Rails 2.3.8 и friendly_id.

Модель человека:

class Person < ActiveRecord::Base
  # Nice URL's in Rails.
  def to_param
    "#{login.downcase.gsub(/[^[:alnum:]]/,'-')}".gsub(/-{2,}/,'-')
  end
end

Контролер людей:

class PeopleController < ApplicationController
  def show
    @person = User.find(params[:id]) 

    if current_user == @person
      @shops = @person.shops.paginate(:page => params[:page], :order => order)
    else
      @shops = @person.shops.by_status('published').paginate(:page => params[:page], :order => order)
    end

  end

end

Модель пользователя (раздетая):

class User < ActiveRecord::Base
  extend ActiveSupport::Memoizable
  acts_as_authentic do |c|
    c.validate_email_field = false
    c.validate_login_field = false
  end

  attr_accessible :login, :email, :password, :password_confirmation, :name, :location, :website,
                  :allow_follower, :allow_message, :allow_updates, :allow_newsletter, :avatar, :role, :remember_me

  # Returns name or login if name is blank
  def full_name
    if self.name.blank?
      login.strip
    else
      (self.name || '').strip
    end
  end
  memoize :full_name

  # Nice URL's in Rails.
  def to_param
    "#{login.downcase.gsub(/[^[:alnum:]]/,'-')}".gsub(/-{2,}/,'-')
  end

end

Определение to_param в People.rb и User.rb не работает.

Все страницы на контроллере Users предназначены исключительно для настроек учетной записи пользователя и предназначены для частного просмотра, поэтому мне не нужен красивый URL-адрес. Но я создал People контроллер для демонстрации в качестве профиля пользователя для публичного просмотра.

URL-адрес people в настоящее время http://abc.com/people/1, я хочу изменить его на http://abc.com/people/login-name-here, но без нарушения @person = User.find(params[:id]) в people контроллере, потому что мне нужно выполнить поиск сфинксов в нем.

Что я могу сделать, чтобы достичь этого? Спасибо.

1 Ответ

0 голосов
/ 03 марта 2012

Надеясь, что это поможет кому-то еще прийти сюда, если вы уже решили это.

Он не должен нарушать User.find(params[:id]) при использовании friendly_id. На самом деле оба маршрута person/login-name и person/123 работают с обоими.

Поскольку вы используете rails 2.3.8, вам нужно будет использовать friendly_id, версия 3.2.1.1 - последняя версия, которая поддерживает activerecord 2.3.x - (можно найти здесь https://rubygems.org/gems/friendly_id/versions/3.2.1.1). Версия 4.x требует activerecord 3 + поэтому не будет совместимым.

  • Во-первых, установите гем (если это еще не сделано), запустите генератор и т. Д. (При необходимости можно получить дополнительную помощь)

в вашей пользовательской таблице я рекомендую добавить cached_slug столбцы (в виде строки)

Затем, после этого ...

Просто добавьте следующее к app/models/user.rb

has_friendly_id :login, :use_slug => true, :cache_column => 'cached_slug'

и вы сможете избавиться от методов to_param в ваших моделях. Не забудьте обновить attr_accessible, чтобы избежать проблем.

Кроме того, вы можете создать метод экземпляра, который возвращает строку для использования с friendly_id, например:

has_friendly_id :stripped_login, :use_slug => true, :cache_column => 'cached_slug'

Тогда просто добавьте:

def stripped_login
  login.gsub(/regexhere/)
end

FriendlyId уменьшает для вас слизняков.

ПРИМЕЧАНИЕ. Я помню, что была проблема с включением has_friendly_id перед элементами attr_accessible. Я почти уверен, что его нужно поместить после этой строки, но сейчас я не могу вспомнить.

...