无论如何都要为sinatra实现友好的URL,例如
我希望用户看到http://xyz.io/username/title而不是。{ http://xyz.io/username/posts/xdsfsdfsdfsd/title
但仍然路由到第二个网址。
有没有使用Sinatra / Rack实现这一目标,还是有任何红宝石可以完成这项工作?
答案 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)
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或者处理“漂亮”的网址 - 以便重新加载和加入书签。
答案 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然后把
手动输入slugsa = Post.find(1)
a.save
每个条目的(并更改数字),friendly_id会自动创建slug。它还将创建任何新帖子的所有slu ..美女! 顺便说一句,我的版本是
activerecord = 3.2.13
friendly_id = 4.0.9
ruby = 1.9.3