Ruby on rails Rails路由:如何让控制器串联以响应相同的匹配路径

Ruby on rails Rails路由:如何让控制器串联以响应相同的匹配路径,ruby-on-rails,ruby,routing,Ruby On Rails,Ruby,Routing,在我的Rails routes.rb文件中,我希望执行以下操作 get '/:id' => 'pages#show' get '/:id' => 'articles#show' 因此,如果访问者输入 http://www.example.com/about-this-site 上面示例中的pages控制器将首先尝试处理它。如果不是的话,下一个控制器将得到一个镜头 想要这样做的原因: 1) 我正在尝试将我的Wordpress站点移植过来,而不为我的所有页面和博客帖子建立新的

在我的Rails routes.rb文件中,我希望执行以下操作

  get '/:id' => 'pages#show'
  get '/:id' => 'articles#show'
因此,如果访问者输入

http://www.example.com/about-this-site
上面示例中的pages控制器将首先尝试处理它。如果不是的话,下一个控制器将得到一个镜头

想要这样做的原因:

1) 我正在尝试将我的Wordpress站点移植过来,而不为我的所有页面和博客帖子建立新的URL。目前,我所有的博客文章文件和页面都直接从根uri“/”文件夹访问


2) 因为我不能,这对我来说是一件学习的事情。但是,我想不经过黑客攻击就可以做到这一点。

从第一个控制器重定向到第二个控制器如何

在页面控制器中

def show
  unless Page.find_by(id: params[:id])
    redirect_to controller: :articles, action: :show, id: params[:id]
  end
end
  def show
    # Handle whatever logic here...
  end
在ArticlesController中

def show
  unless Page.find_by(id: params[:id])
    redirect_to controller: :articles, action: :show, id: params[:id]
  end
end
  def show
    # Handle whatever logic here...
  end
编辑

如果您确实不想重定向,则可以将逻辑整合到单个操作中:

def show
  if Page.find_by(id: params[:id])
    render :show
  elsif Article.find_by(id: params[:id])
    render controller: :articles, action: :show
  else
    # Handle missing case, perhaps a 404?
  end
end

但是,如果可能的话,我建议使用重定向。这是一个更干净的解决方案,可以隔离控制器代码。

问题在于,这会导致客户端重新加载页面。当请求返回到Rails路由时,第一个路由将再次尝试处理它。对,您必须为第二个操作使用不同的路由名称
get'articles/:id'=>'articles#show'
,但为什么会出现这个问题?它不会导致无限重定向,也不会重新加载页面,因为第一个操作(
page#show
)不会实际加载页面,它只是以301重定向进行回复。嗯……事实上,我的评论是错误的。它不一定会回到同一个地方。但是,它不会是相同的url。它会像右图一样被发送回系统,但这就是301重定向的意义所在。SEO爬行器将缓存来自
example.com/关于此站点的页面
。唯一的另一种选择是将逻辑合并到单个操作中。我已经更新了案例的答案,没有重定向。