2

Github 是如何设法获得代表用户存储库的友好 URL 的?abc 对于由 username调用的项目foo,他们如何使用如下 URL http://github.com/foo/abc:. 他们是否abc从 URL 中的标题中获取数据库的模型(这听起来不合理,因为他们正在修改标题)。abc他们如何传输可以获取并在视图中显示的存储库的唯一 ID ?

我问的原因是我面临着创建更友好的 URL 来查看资源的类似问题。MongoDB 的对象 ID 很长,使 URL 看起来很可怕。有解决方法吗?所有演示资源的 CRUD(或 REST)URL 的教程总是包含对象的唯一 ID(例如http://mysite.org/post/1,或http://mysite.org/post/1/edit. 有更好的方法吗?

4

5 回答 5

4

没有看过他们的代码,我无法确切地告诉你他们是如何做到的,但如果你使用的是 Rails,至少有两个 Ruby gem 会给你类似的结果:

看看Sluggedfriendly_id

于 2012-05-26T08:45:32.563 回答
1

http://github.com/foo/abc是唯一的存储库标识符(用于该存储库的主分支)。我假设他们在某个地方有一张看起来像这样的桌子:

repository-id | user-id | project-id

并且只是根据用户和项目而不是存储库ID进行查找。

您需要在内部和用户友好的 id 之间进行一些特定于域的映射,但您需要确保这是 1:1 映射。

于 2012-05-28T19:39:12.720 回答
1

在修改应用程序以使用友好的 url 时,请参阅方法、gem 和常见问题的解决方案。

http://railscasts.com/episodes/314-pretty-urls-with-friendlyid?view=asciicast

(尽管 Ryan Bates 值得为此获得代表 +)

于 2012-05-31T10:31:51.570 回答
0

我使用 FriendlyID 和Nested Resources模拟了这样的结构。

本质上,使用友好的 ID 来获取to_param路由中的 -ish slug,然后设置嵌套资源。以 GitHub 为例:

路线.rb

resources :users do
  resources :repositories
end

然后在您的控制器中,例如,对于存储库,您可以检查是否存在params[:user_id]并使用它来确定路由中的用户。我检查存在的原因是因为我做了类似(大致)的事情:

/myrepositories/:repository_id
/:user_id/:repository_id

所以我的控制器会:

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

我在这里按照本教程开始使用同一个项目。

于 2012-06-01T14:37:46.713 回答
0

如果 Web 服务器执行此操作(例如 Apache),这称为URL 重写,而当它发生在 Web 应用程序框架(例如 Ruby on Rails)中时称为路由。

http://www.sinatrarb.com/intro#Routes
http://httpd.apache.org/docs/current/mod/mod_rewrite.html

于 2012-06-01T15:52:57.090 回答