Sinatra的友好URL

时间:2012-05-20 16:00:24

标签: ruby sinatra rack friendly-url

无论如何都要为sinatra实现友好的URL,例如

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

但仍然路由到第二个网址。

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

选项1:从“漂亮”URL重定向到“真实”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或者处理“漂亮”的网址 - 以便重新加载和加入书签。

答案 2 :(得分:0)

FriendlyId与ActiveRecord配合使用,而Activeatord可用于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文件中需要它(需要&#39; friendly_id&#39;),并确保我将这两行放在Post类的顶部

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

无论我在哪里引用:url中的id,params哈希或任何地方,无论是在app.rb还是在视图中的链接,我都将其更改为:slug。 slug是一个唯一的标识符,所以它工作正常。我已经在数据库中有一些帖子,所以我只是通过运行tux然后把

手动输入slugs
a = Post.find(1)
a.save
每个条目的

(并更改数字),friendly_id会自动创建slug。它还将创建任何新帖子的所有slu ..美女! 顺便说一句,我的版本是

activerecord = 3.2.13
friendly_id = 4.0.9
ruby = 1.9.3