Sinatra 的友好 URL

Posted

技术标签:

【中文标题】Sinatra 的友好 URL【英文标题】:Friendly URLs for Sinatra 【发布时间】:2012-05-27 08:19:25 【问题描述】:

是否有办法为 sinatra 实现友好的 URL,例如,

我希望用户看到 http://xyz.io/username/title 而不是 http://xyz.io/username/posts/xdsfsdfsdfsd/title

但仍会路由到第二个 URL。

是否可以使用 Sinatra/Rack 实现这一目标,或者是否有任何 ruby​​ gems 可以完成这项工作?

【问题讨论】:

您是否尝试过重定向请求(sinatra-book.gittr.com/#handlers)? 【参考方案1】:

将处理请求的代码放在一个普通的 Ruby 方法中,然后简单地让两个路由都调用该方法作为它们的操作。

def handle_request
   #params hash is available here as in normal route block
end

get '/:username/posts/:id/:title' do
  handle_request
end

get '/:username/:title' do
  handle_request
end

【讨论】:

我需要来自 '/:username/posts/:id/:title' 的 :id 信息,同时希望用户在他的浏览器 url 栏中看到 '/:username/:title',否则如何能否实现这一点,是否有任何适合 Sinatra 的友好 url gem,例如friendlyId(用于 RoR)。 马特,你的回答很好,但是对于相同的内容有两个 URL 是不好的,SEO 方面。 @ArjunVariar 我建议保留一个更漂亮的 URL。 @ArjunVariar 如果用户没有输入长 url,那么无论如何你都不会得到 :id 值。 FriendlyId 是对活动记录的补充,所以如果你想要这样的东西,你的解决方案将取决于你如何存储帖子。您需要能够按名称而不是 id 来检索它们。【参考方案2】:

选项 1:从“nice”网址重定向到“real”网址

get "/:user/:title" do
  user, title = params.values_at('user','title')
  id = find_id_from_title_and_user( user, title )
  redirect url("/#user/posts/#id/#title")
end

选项 2:让“丑陋”的网址始终看起来“不错”

当用户加载丑陋的 URL 时,将地址栏(无需重新加载页面)更改为更漂亮的 URL:

<!-- on the 'ugly' page -->
<script type="text/javascript">
  // Make the address bar lie about what our address is
  // See: https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history
  history.pushState(, window.title, calculateNiceURLString());
</script>

还需要选项 1(或对“不错”的 URL 进行一些处理)才能重新加载和添加书签。

【讨论】:

【参考方案3】:

FriendlyId 与 ActiveRecord 一起使用,而 Activerecord 可用于 Sinatra。按照此博客教程http://danneu.com/posts/15-a-simple-blog-with-sinatra-and-active-record-some-useful-tools/ 了解如何实现这一目标。之后我所做的就是将friendly_id 放入我的gemfile 中,然后运行

bundle
rake db:create_migration NAME=add_slug_to_posts

编辑新创建的迁移看起来像

class AddSlugToPosts < ActiveRecord::Migration
    def change
        add_column :posts, :slug, :string
        add_index :posts, :slug, unique: true
    end
end

然后运行

rake db:migrate

在我的 app.rb 文件中需要它之后(需要'friendly_id'),并确保将这两行放在我的 Post 类的顶部

class Post < ActiveRecord::Base
    extend FriendlyId
    friendly_id :title, use: :slugged
...
end

无论我在 url、params hash 还是任何地方引用 :id,无论是在 app.rb 中还是视图中的链接,我都将其更改为 :slug。 slug 是一个唯一标识符,因此它工作正常。我已经在数据库中有一些帖子,所以我手动输入 slugs 只需运行 tux 然后放入

a = Post.find(1)
a.save

(并更改数字)每个条目,friendly_id 自动创建 slug。它还将在创建任何新帖子时创建所有 slug。美丽! 顺便说一句,我的版本是

activerecord = 3.2.13
friendly_id = 4.0.9
ruby = 1.9.3

【讨论】:

以上是关于Sinatra 的友好 URL的主要内容,如果未能解决你的问题,请参考以下文章

你会推荐啥与 Sinatra 等效的 python? [关闭]

使用 Sinatra 对端点进行版本控制

sinatra 基本用法

Sinatra 与 Rails

设置布局的 Sinatra 方法

如何使用 HAML 提高 Sinatra 性能?