1

我已经开始创建一个基于模型的解决方案来创建短 URL,但我想知道在它自己的集合(使用 mongoid)中为模型之间的标记构建索引然后搜索是否会更好?或者,如果存在宝石而不是滚动我自己的解决方案。

现在我正在使用 Mongoid::Token 为特定集合生成唯一令牌(即 cUaIxBu),然后使用附加字母(->(c)UaIxBu)来确定如何将特定请求路由到哪个控制器。

任何想法或指示?

在此示例中,alternatedoma.in/cUaIxBu 将指向 realdomain.com/cities/1234

路线

  get '/:id' => 'home#tiny_url', :constraints => { :domain => 'alternatedoma.in' }

控制器

  def tiny_url
    case params[:id].slice!(0)
    when 'f'
      @article = Article.find_by_token(params[:id])
      redirect_to feature_url(@article)
    when 'c'
      @city = City.find_by_token(params[:id])
      redirect_to city_url(@city)
    when 'p'
      @place = Place.find_by_token(params[:id])
      redirect_to feature_url(@place)
    end
  end
4

1 回答 1

1

我们在我目前正在开发的应用程序中使用了几乎相同的系统——而且它似乎运行良好(到目前为止!)。我唯一能想到的是,您可以简化您的 LoC,并在将来轻松添加对其他模型的支持(如果需要):

supported_models = {:a => Article, :c => City, :p => Place}
prefix = params[:id].slice!(0).to_sym
if supported_models.has_key?(prefix)
  @obj = supported_models[prefix].find_by_token(params[:id])
  redirect_to send(:"#{supported_models[prefix].name.underscore}_url", @obj)
end

显然,这将要求您的路由助手遵循与您的模型相同的命名。即:Article> article_urlCity>city_url等。

于 2013-02-16T13:29:31.660 回答