无论如何,是否可以为 sinatra 实现友好的 URL,例如,
我希望用户看到http://xyz.io/username/title而不是 http://xyz.io/username/posts/xdsfsdfsdfsd/title
但仍然路由到第二个 URL。
是否可以使用 Sinatra/Rack 实现这一目标,或者是否有任何红宝石可以完成这项工作?
无论如何,是否可以为 sinatra 实现友好的 URL,例如,
我希望用户看到http://xyz.io/username/title而不是 http://xyz.io/username/posts/xdsfsdfsdfsd/title
但仍然路由到第二个 URL。
是否可以使用 Sinatra/Rack 实现这一目标,或者是否有任何红宝石可以完成这项工作?
将处理请求的代码放在一个普通的 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
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
当用户加载丑陋的 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 进行一些处理)才能重新加载和添加书签。
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