Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在RubyonRails中动态添加URL?_Ruby On Rails_Ruby_Url_Web - Fatal编程技术网

Ruby on rails 如何在RubyonRails中动态添加URL?

Ruby on rails 如何在RubyonRails中动态添加URL?,ruby-on-rails,ruby,url,web,Ruby On Rails,Ruby,Url,Web,给定一个复杂的url,我想给用户一个简短而漂亮的url。 例如 如果用户给我url1,我将返回给用户一个名为www.something.com/some-name的url 如果用户给我url2,我将返回给用户一个名为www.something.com/some-other-name的url。 (我将在数据库中存储提供的url及其匹配的url) 我计划接收缩短的url并在数据库中找到相应的url,并将用户重定向到原始url。 但是我应该如何将www.something.com/some-name路

给定一个复杂的url,我想给用户一个简短而漂亮的url。 例如 如果用户给我url1,我将返回给用户一个名为www.something.com/some-name的url

如果用户给我url2,我将返回给用户一个名为www.something.com/some-other-name的url。 (我将在数据库中存储提供的url及其匹配的url)

我计划接收缩短的url并在数据库中找到相应的url,并将用户重定向到原始url。
但是我应该如何将www.something.com/some-name路由到RubyonRails中正确的控制器呢?如何动态添加这些路由

这很简单,首先创建一个模型,例如名为
ShortUrl
,带有两个 字段,例如
short\u url
original\u url

然后创建控制器,例如调用它
short\u url\u controller
,并将其添加到 路线,但是如果你把路线放在最开始的地方,让它变得非常 通用,它将匹配所有路线,并且您的应用程序无法正常运行, 也就是说,如果应用程序有其他路线,而不仅仅是为了这个目的

get /:short_url, to: 'short_urls#go'
或者,如果你想确保它与其他人玩得很好,那么只需添加一小部分 前缀

然后控制器,如果您有设计或任何身份验证,请确保 跳过这里的认证,你不希望人们点击你的短网址 收到“请登录”警报

def ShortUrlsController < ApplicationController
  skip_before_action :authenticate_user!

  def go
    url = ShortUrl.find_by(short_url: params[:short_url])
    redirect_to url.original_url
  end

end
def ShortUrlsController

您还应该处理错误的url,因为如果url不存在,
find_by
将失败,因此添加一些内容以使用404优雅地失败。

您看过了吗,谢谢,我一定会看一看!这真的很有帮助!非常感谢。
def ShortUrlsController < ApplicationController
  skip_before_action :authenticate_user!

  def go
    url = ShortUrl.find_by(short_url: params[:short_url])
    redirect_to url.original_url
  end

end