创建到外部URL的rails路由

时间:2010-09-01 22:56:40

标签: ruby-on-rails routing

我的很多用户都会继续http://(rails app URL)/blog,但我实际上并没有博客。我终于设置了一个Posterous博客,现在想要引导我的用户。有没有办法使用routes.rb配置它?有没有更好的方法不涉及编辑httpd.conf文件?

4 个答案:

答案 0 :(得分:64)

我知道这是旧的,所以万一其他人需要这个用于rails 4:

get "/blog" => redirect("http://example.com/blog")

在Rails 4中使用get而不是Match,否则会出现运行时错误

答案 1 :(得分:60)

取决于您使用的Rails版本。

Rails 3

# in routes.rb
match "/blog" => redirect("http://example.com/blog"), :as => :blog

Rails 2

# in routes.rb
map.blog '/blog',
  :controller => "a_helper_controller",
  :action => "redirect_to_blog"

# in a_helper_controller.rb
def redirect_to_blog
  redirect_to "http://example.com/blog"
end

答案 2 :(得分:11)

对于Rails 5:

get '/stories', to: redirect('/articles')
get '/stories', to: redirect('http://google.com')

Rails Guide source page

答案 3 :(得分:0)

将前端路由模拟为常规的Rails控制器路由

背景:最初有Rails整体渲染html视图。然后是前端React应用程序,需要将后端转换为JSON API,并生成指向前端应用程序的URL(主要在电子邮件中),该前端应用程序的行为几乎与Rails控制器完全一样。

我一直在寻找一种模仿Rails资源的方法来构造URL,但要指向前端URL并生成适当的path_helpers,可以轻松地与我的应用程序,RSpec,cucumber / Capybara等一起使用。我在路由周围发现了这种黑客来模仿前端路由,这还需要传递一个额外的参数,以完全消除歧义的前端VS后端路由(在水豚测试中很有用)

frontend_scope = {
  as: :frontend,
  host: Rails.configuration.frontend_host, # like https://www.example.com
  port: Rails.configuration.frontend_port, # 443
  constraints: (lambda { |request| request.params[:app] == :frontend })
}
scope(frontend_scope) do
  root to: 'static_pages_controller#home'
  resources :articles, only: [:show, :index]
end

然后在我的Ruby代码中我可以使用

frontend_article_url(@article, app: :frontend)
frontend_articles_url(app: :frontend)
... (and everything that can be generated in a classic rails app)

不便的是,重定向中将有一个app参数,您必须在前端应用程序和所有其他网络应用程序(例如Google Analytics(分析),搜索引擎等)上忽略它。

*问题是,如果您的前端同时有/articles和后端都有/articles,则您的应用将无法通过两条解析路径到相同的URL,而无需额外的参数