0

无论如何,是否可以为 sinatra 实现友好的 URL,例如,

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

但仍然路由到第二个 URL。

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

4

3 回答 3

2

将处理请求的代码放在一个普通的 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
于 2012-05-20T19:56:42.713 回答
0

选项 1:从 'nice' URL 重定向到 'real' URL

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 时,将地址栏(无需重新加载页面)更改为更漂亮的 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 进行一些处理)才能重新加载和添加书签。

于 2012-05-21T19:17:49.777 回答
0

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 是一个唯一标识符,因此它工作正常。我已经在数据库中有一些帖子,所以我只需运行 tux 然后手动输入 slug

a = Post.find(1)
a.save

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

activerecord = 3.2.13
friendly_id = 4.0.9
ruby = 1.9.3
于 2013-04-10T00:59:31.590 回答