用户友好的URL

时间:2011-10-21 13:22:51

标签: ruby-on-rails-3

我目前为分页模型设置了以下设置:/pages/6-about

class Page < ActiveRecord::Base 
  def to_param
    "#{id}-#{permalink}"
  end 
end

我希望网址为/pages/about。什么是最好的解决方案?提前谢谢。

2 个答案:

答案 0 :(得分:1)

所以你改变了你的

def to_param
  permalink
end

然后实施

def self.from_param(value)
  find_by_permalink(value)
end
在您的网页模型中

在您的控制器中,您需要

def show
  @page = Page.from_param(params[:id])
  ...
end

答案 1 :(得分:0)

您的问题没有太多信息。 有几条路可以做到这一点,但这一切都取决于你在做什么。

如果页面数量是固定的,您可以保留一个静态哈希表来跟踪名称&lt; - &gt;标识。

 private static readonly Dictionary<string, int> PagesDict = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase) { { "about", 6 }, { "home", 1 }, { "xxx", 2 } };

///<summary>Gets a page id by a string name. Returns -1 if page doesn't exists.</summary>
public static int GetPageId(string name)
{
    int result;
    if (!PagesDict.TeyGetValue(name, out result))
        return -1;
    return result;
}

如果你需要一个读写字典,你可以使用ConcurrentDictionary,但当然,这个字典不存储在任何地方,如果没有从DB表或XML这样的字体加载字典,它将会丢失。 / p>

如果您的页面是动态的并且是从数据库加载的,那么您需要在数据库上有一个表,它通过名称为您提供id。您可以按名称索引表,然后查询应该非常快。 如果要减少对DB的访问次数,可以使用并发字典实现(非常复杂的)缓存系统。

编辑 -

恢复ID所需的信息量必须大于或等于ID字段可以存储的信息量:)

我的意思是......

如果永久链接不是唯一的,则无法从中获取ID。

如果永久链接字段是唯一的,则它与ID相同,它是字符串ID。 然后你可以编写一个查询,给定永久链接会返回一个id。

如果你可以从一个独特的字段中恢复一个ID,例如,永久链接和fieldX,你可以写一个查询,其中permalink ='about'和fieldX ='XXX'