0

使用 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.rbUser.rb

控制器下的所有页面Users都纯粹用于用户的帐户设置,并且用于私人视图,因此我不需要任何漂亮的 URL。但是我创建了一个People控制器来展示用户的个人资料以供公众查看。

当前的peopleURL 是http://abc.com/people/1,我想将其转换为http://abc.com/people/login-name-here,但不会破坏@person = User.find(params[:id])inpeople的控制器,因为我需要在其中执行 sphinx 搜索。

我能做些什么来实现它?谢谢你。

4

1 回答 1

0

如果您已经解决了这个问题,希望这会帮助其他人来这里。

它不应该破坏User.find(params[:id])if using friendly_id .. 事实上,两者person/login-nameperson/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+,因此不兼容。

  • 首先,安装 gem(如果尚未完成),运行生成器等...(如果需要,可以提供更多帮助)

在您的用户表上,我建议添加一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 为您降低 slug。

注意:我记得在 attr_accessible 项目之前包含 has_friendly_id 存在问题。我几乎可以肯定它需要放在那条线之后,但我现在似乎不记得了。

于 2012-03-03T12:36:27.403 回答