how to set up and use a Rails routes prefix

2020-05-25 06:51发布

问题:

When running rake routes I see:

 Prefix   Verb   URI Pattern                                       Controller#Action
 articles  GET    /articles(.:format)                               articles#index
 new_article GET    /articles/new(.:format)                           articles#new

along with some others I left out.

This is because my routes.rb file has:

resources :articles

My question is what exactly is this Prefix, and how would I change it?

From my understanding it is a shortcut to the URI, so in my app I could just refer to new_article instead of articles/new? Do I really refer to @new_article or is there some other format to reference it.

Second question, how do I edit that? Lets say I want a prefix called new_document instead of new_article for the get request on that url. What would I put in my routes.rb file?

I looked at this link from the rails guides but all it seems to show is how to make the url longer by adding a prefix in front of it.

回答1:

Paths

I'm not sure why it's called prefix - it should be called path helper:

The bottom line is when you call helpers like link_to or form_tag etc - they will require paths to populate different actions in your app's routing structure.

As Rails favours convention over configuration & DRY programming, meaning if you can reference these path helpers over using standard urls, it will allow you to make one reference & chance the route as required

EG

Calling articles_path is far more powerful than referencing /articles every time


Routes

To answer your question properly, you will need to appreciate Rails uses resourceful routing - basically meaning that every route helper you create should be defined around any resource in your application

Due to the MVC structure of Rails, these resources will typically be defined by the controllers you use:

#config/routes.rb
resources :articles #-> articles_path etc

You should always reference your resources as they are (in your case articles).

To customize the path helper, you'll need to change the reference in the routes file, like this:

#config/routes.rb
resources :articles, as: :document, path: "document" #-> domain.com/documents

This allows you to define custom routes / path helpers, allowing you to call those as you wish



回答2:

It let's you use shortcuts such as new_article_path or new_article_url in your controllers and views. These come in very handy when doing things like redirecting users to a specific page or generating dynamic links.

You can change the prefix by adding the as: option in your routes.rb file. For example:

GET '/new', to: 'articles#new', as: 'my_new_article`

This would change the prefix to my_new_article.



回答3:

You're right, the prefix is used in building the named routes, so the resources method in the routes file creates routes like articles_path, new_article_path etc. To refer to a route in your code, add path to the prefix that you see when running rake routes.

If you want to change the prefixes generated by the resources method in your routes file, use the :as option, like this:

resources :articles, as: :posts

This will generate routes like 'new_post_path' that you can use in your views.

If you want to change the path of the route in the browser, you can use the path option:

resources :articles, path: :posts

Which will generate routes like /posts/1 or /posts/new instead of /articles/1 or /articles/new, but the routes will still be named articles_path, new_article_path etc in your code. You can use both :path and :as options to change both the path and the prefix of your resource routes.

To change a basic route in your routes file, you can simply use :as, like so:

get 'messages' => 'messages#index', as: :inbox

This will create the route inbox_path which you can use in your code.

Hope that helps!



回答4:

You can also use route scopes for it. In your routes.rb file:

Rails.application.routes.draw do

  # Any other routes here
  scope 'admin' do
    resources :articles
  end
end

/admin/articles and all the other CRUD related routes will work with link_to, form submit controls, etc.



回答5:

The prefix can be used with the route helpers to generate routes in your application. So in your application, the articles_path helper generates a route for articles index page, new_article_path is the route for the new article page, and article_path(@article) would be the route for the show page for @article.

To specify a different route, you could change your routes.rb file to:

resources :articles, as: :documents

That will give you:

documents  GET    /articles(.:format)                               articles#index
new_document GET    /articles/new(.:format)                           articles#new

I might consider changing the resource name to documents as it can get confusing when you rename routes and get a mix of terminology between the route and the controller.



回答6:

You can do something like this:

resources :articles do
 collection do
      get  "new"  => "articles#new",  :as => 'new_document'
 end
end

and you can use it:

link_to "New foo", new_document_path 

or

link_to "New foo", new_document_url

url prints the absolute url (http://server.com/controller/action) meanwhile path prints the relative url (/controller/action).



回答7:

You can try in config.ru file

 map 'YOUR_PREFIX_HERE' do
   run Rails.application
 end