Rails如何生成像Google Drive一样的永久链接?

时间:2014-02-18 13:38:57

标签: ruby-on-rails

当我们分享Google云端硬盘表单时,它会为我们提供公开网址。

我们如何在Rails应用程序中实现这一点?它应该是随机的而不是重复的。

有人能帮帮我吗?感谢。

更新

我的意思是这个网址:

https://docs.google.com/forms/d/1PPVIMrDo61Er9tqYlJRntfNT73jpxtd_YJGGjXOMlAw/edit?usp=drive_web

但我想要一个像这种形式的网址:

http://yourhost.com/1PPVIMrDo61Er9tqYlJRntfNT73jpxtd_YJGGjXOMlAw

1 个答案:

答案 0 :(得分:1)

您应该向要与其共享展示操作网址的模型添加permalink字段。实际上你只能使用/model/:id但是如果你想使用/model/:permalink,那么只需添加新字段,生成类似SecureRandom的永久链接并将其保存到模型中,然后构建URL并分享。

你可以这样做:

class SomeModel < ActiveRecord::Base
  after_create :generate_permalink

  private

  def generate_permalink
    self.permalink = SecureRandom.urlsafe_base64(32)
  end
end

然后在某些视图中,您的用户可以找到永久链接网址:

<%= link_to "Title of the model", some_model_url(some_model.permalink) %>

上面的帮助程序会创建一个转到some_model控制器的show动作的URL。当然,你可以根据需要创建一个新动作并将其添加到你的路线中,但我只是采用更简单的方式。

在你的控制器的show动作中,你需要通过永久链接找到模型:

class SomeModelController < ApplicationController
  def show
    @some_model = SomeModel.where("id = :id OR permalink = :id", id: params[:id]).first
  end
end

通过在路线和视图中进行更多调整,您可以将网址缩短为您在问题中发布的内容:

http://yourhost.com/1PPVIMrDo61Er9tqYlJRntfNT73jpxtd_YJGGjXOMlAw

要使其正常工作,您必须在routes文件的底部添加一条路由,以便在没有其他路由匹配时,您的永久链接路由将捕获随机字符串并将其分发给控制器您的选择:

# config/routes.rb
get "/:permalink", to: "some_model#show", as: :permalink

此处的参数将在控制器中调用params[:permalink]而不是params[:id]。您可以通过制作路线get "/:id"来简化控制器中的代码,但我认为明确是好的。

然后,只需更改视图即可输出正确的网址:

<%= link_to "Title of the model", permalink_url(some_model.permalink) %>

希望有所帮助。