Rails动态重定向

时间:2014-01-31 14:03:11

标签: ruby-on-rails routing

我需要为rails应用程序创建动态重定向模型。它类似于wordpress重定向插件,如果你随时使用它。 http://wordpress.org/plugins/redirection/

模型将存储的是redirect_this_path字符串,应将final_path重定向到该字符串。因此,如果用户访问我的应用程序请求redirect_this_path,他将被重定向到final_path

但是,如果在数据库中找不到匹配的条目,则应将请求转发到routes.rb文件中定义的其他路由。因此,基本上重定向模型将过滤所有请求并重定向其拥有数据的请求,并将其他请求转发给已在routes.rb文件中定义的路由。

有什么方法可以实现,有什么建议吗?

4 个答案:

答案 0 :(得分:0)

不确定我理解正确,但也许这适合你?

在routes.rb上:

get 'redirect/path', to: redirect('final/path')

答案 1 :(得分:0)

您应该执行以下操作:(例如在应用程序控制器中)

def path_check
  if request.path == path_that_needs_redirecting
    redirect_to final_path
  end
end

然后简单地使用:(在应用程序或您需要的每个控制器中)

before_filter :path_check

希望有所帮助

修改

如果您有许多需要重定向的路径,请执行

if paths_that_need_redirecting.include? request.path

答案 2 :(得分:0)

@Piotr Kruczek很接近,但听起来你想要将每条路径重定向到它自己独特的final_path,你实际上需要做这样的事情:

appliction_controller.rb

before_filter :path_check

def path_check
  if ModelName.find_by_column_name(request.path)
    redirect_to ModelName.find_by_column_name(request.path).final_path
  else
    redirect_to deafult_path
  end
end

答案 3 :(得分:0)

最简单的方法 - 定义自定义网址助手并将所有魔法放在那里。但更有趣的方式是...攻击Rails内部并击败它的sh * t。例如:ActionDispatch and url_for。我不确定,但也许你可以实现自定义路由机制:

  def url_for(options = nil)
    case options
    when nil
      _routes.url_for(url_options.symbolize_keys)
    when Hash
      _routes.url_for(options.symbolize_keys.reverse_merge!(url_options))
    when String
      options
    when Array
      polymorphic_url(options, options.extract_options!)
    else
      polymorphic_url(options)
    end
  end

我相信使用提供给此方法的参数,您将能够实例化模型并从中请求自定义URL(或者如果出现问题,则继续进行基本处理)。

然而,猴子修补Rails ......它闻起来。更清洁的方法是将其提取到单独的gem并通过您自己的测试套件覆盖它。