【问题标题】:Friendly URLs for SinatraSinatra 的友好 URL
【发布时间】: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 可以完成这项工作?

【问题讨论】:

标签: ruby sinatra rack friendly-url


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2011-08-25
      • 2010-09-07
      • 2013-08-31
      • 2012-01-15
      • 2013-06-02
      • 2012-06-03
      • 2011-01-04
      • 1970-01-01
      相关资源
      最近更新 更多