我目前为分页模型设置了以下设置:/pages/6-about
class Page < ActiveRecord::Base
def to_param
"#{id}-#{permalink}"
end
end
我希望网址为/pages/about
。什么是最好的解决方案?提前谢谢。
答案 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'