当我们分享Google云端硬盘表单时,它会为我们提供公开网址。
我们如何在Rails应用程序中实现这一点?它应该是随机的而不是重复的。
有人能帮帮我吗?感谢。
更新
我的意思是这个网址:
https://docs.google.com/forms/d/1PPVIMrDo61Er9tqYlJRntfNT73jpxtd_YJGGjXOMlAw/edit?usp=drive_web
但我想要一个像这种形式的网址:
http://yourhost.com/1PPVIMrDo61Er9tqYlJRntfNT73jpxtd_YJGGjXOMlAw
答案 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) %>
希望有所帮助。