简体   繁体   中英

Rails Routing: How to have controllers in series to respond to same matching path

In my Rails routes.rb file I'm wanting to do something like the following.

  get '/:id' => 'pages#show'
  get '/:id' => 'articles#show'

So that if a visitor types in

http://www.example.com/about-this-site

The pages controller in the above example would get first shot at handling it. Then if not, the next controller in line would get a shot.

REASONs for wanting to do this:

1) I'm trying to port my Wordpress site over without establishing new urls for all my pages and blog posts. As it stands, all of my blog post files and pages are accessed directly off the root uri '/' folder.

2) Because I'm not able to, it's a learning thing for me. But, I want to do it without a hack.

How about redirecting to the second controller from your first controller?

in PagesController

def show
  unless Page.find_by(id: params[:id])
    redirect_to controller: :articles, action: :show, id: params[:id]
  end
end

in ArticlesController

  def show
    # Handle whatever logic here...
  end

Edit

If you really don't want to redirect then you can consolidate the logic into a single action:

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

However, I'd recommend using a redirect if possible. It's a cleaner solution and keeps your controller code isolated.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM