【问题标题】:Friendly URL Question, with a Twist友好的 URL 问题,有点扭曲
【发布时间】:2010-11-25 13:34:40
【问题描述】:

我有一个用户模型和一个配置文件模型。

user has_one :profile profile belongs_to :user

由于这种关系,我通过调用用户 ID 来提取我的个人资料。所以我的网址看起来像这样:website.com/users/[user_id]/profile

我不确定我的问题是否有解决方案。这里是: 我想显示 SEO 友好的网址。我正在考虑为此使用friendly_id。但是,我们的个人资料是针对企业的,它是我们希望在 url 中输入的企业名称。问题是我们的用户模型故意不询问公司名称,而当前显示在 url 中的是user_id

有没有办法从配置文件模型中获取企业名称(即@profile.name),并使用它来填充 url 的 [user_id] 部分?

更新:我已经设置了friendly_id gem,看起来这可以工作。在我的个人资料模型中,我有这个:has_friendly_id :name, :use_slug => true

当我更新个人资料时,friendly_id 确实通过将个人资料中的公司名称放入网址的 user_id 部分来对网址进行 slugify。但是,当然,这引发了异常。

因此,如果配置文件模型中的商家名称是 Mike's Bar,则 URL 现在显示为 /users/mike-s-bar/profile。例外情况是这样的:找不到带有ID=mike-s-bar.的用户

这是我的个人资料控制器:

def show
  @user = User.find(:all)
  @profile = User.find(params[:user_id])
end  

有没有办法让它工作?

【问题讨论】:

    标签: ruby-on-rails models friendly-url slug


    【解决方案1】:

    嗯,企业是否有多个用户?如果是这样,/users/xzy/profile 怎么可能是唯一的呢?

    否则:我认为friendly_id 不能处理模型表之外的列。但是这里我会尝试一种方法:

    class User
    
      # used by rails to generate URLs - defaults to ID
      def to_param
        "#{self.id}-#{self.business.name}"
      end
    
      ...
    end
    

    find 方法会自行跳过破折号后面的所有内容。这会导致您的 URL 可读性降低:/users/xzy/profile 将变为 /users/7-xzy/profile,这与 SO 的做法非常相似。

    【讨论】:

    • 我支持这个,但会添加一个参数化调用:
      def to_param "#{id}-#{business.name.parameterize}" end pre> 您希望将  保留在 URL 中,因为我们确信它可以唯一标识您的用户。
    猜你喜欢
    • 2011-11-02
    • 2011-08-18
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 2014-08-29
    • 1970-01-01
    • 2011-04-19
    • 2012-10-21
    相关资源
    最近更新 更多