可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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