Rails中的高级布线:约束与设计助手混合在一起

时间:2018-07-24 08:17:47

标签: ruby-on-rails devise routing

我想做一些非常具体的事情。我搜索了但没有找到答案。我是Rails的初学者,所以请友善:) 我正在Rails 5.2(有设计)的网站上工作,该网站必须可以在本地网络中访问,也必须具有公共访问权限。 专用ip和公用ip以及未经身份验证的用户的路由必须不同。 我正在尝试做这样的事情:

if (unauthenticated && public_network?)
  { root to: 'pages#public' } 
  { "*path" to: 'pages#public' }
else 
  { root to: 'pages#home' }

对于网站的所有路由,外部人员都将被重定向到特定的已登录界面(具有不同布局的pages#public)。 当他们通过身份验证或使用私有IP时,网站将以pages#home

进行响应

所以我试图在route.rb的第一行中做类似的事情:

  unauthenticated :user do
    // Catch all routes and redirect to public method in pages ctrl for all publics ips
    get '*path', to: 'pages#public',
      constraints: lambda { |request| !request.remote_ip.in? ['127.0.0.1' , '172.18.0.1'] }
    get '/', to: 'pages#public',
      constraints: lambda { |request| !request.remote_ip.in? ['127.0.0.1' , '172.18.0.1'] }
    // And for the unauthenticated users on the Lan :
    root to: 'pages#home'
  end

然后是其余的路由行为...

我坚信这是可行的,但没有成功。 它仍然适用于private ip,但是在public ip上,即使经过身份验证,我也始终重定向到pages#public。 我乐于接受所有可以帮助我的解决方案。

谢谢:)

1 个答案:

答案 0 :(得分:0)

类似的事情应该起作用:

unauthenticated :user do
  # `public_network?` is a placeholder for your specific checks
  constraints ->(request) { public_network? } do
    root to: 'pages#public'
    get '*path', to: 'pages#public'
  end
end

authenticated :user do
  root to: 'pages#home'
  get '/', to: 'pages#home'
end

另一个问题是"public""home"都是同一控制器的动作。不过,对于测试应用程序而言,这并不是什么大问题。