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的主要内容,如果未能解决你的问题,请参考以下文章