Создание ссылки на маршрут рельсов - PullRequest
1 голос
/ 26 октября 2019
Rails 5.2.3

В моем route.rb у меня есть:

get '/books/:author', to: 'books#index'
get '/books/:author/show', to: 'books#show'
post '/books/:author/create', to: 'books#create'

, который при запуске rake: маршруты дает мне:

GET    /books/:author(.:format)  books#index
GET    /books/:author/show(.:format)  books#show
POST   /books/:author(.:format)  books#create

Когда помощник по маршруту не являетсяпредоставленный rake: routines, могу ли я предположить, что когда я создаю ссылку на него в представлении, я могу использовать имя модели, например: books_path или books_url? что-то вроде:

= link_to books_path(:author => @author), :method => :post

Я пробовал это, но я получаю сообщение об ошибке:

undefined method books_path

Итак, я либо что-то не так делаю в Routes.rb, либо я нессылаться на него правильно?

Ответы [ 4 ]

2 голосов
/ 26 октября 2019

Просто, чтобы нагромождать, я предлагаю вам использовать вложенные маршруты:

resources :authors do 
  resources :books, shallow: true 
end
resources :books, only: [:index, :create, :new]

, которые дадут вам (среди прочего):

   author_books GET    /authors/:author_id/books(.:format)      books#index
                POST   /authors/:author_id/books(.:format)      books#create
new_author_book GET    /authors/:author_id/books/new(.:format)  books#new
      edit_book GET    /books/:id/edit(.:format)                books#edit
           book GET    /books/:id(.:format)                     books#show
                PATCH  /books/:id(.:format)                     books#update
                PUT    /books/:id(.:format)                     books#update
                DELETE /books/:id(.:format)                     books#destroy
        authors GET    /authors(.:format)                       authors#index
                POST   /authors(.:format)                       authors#create
     new_author GET    /authors/new(.:format)                   authors#new
    edit_author GET    /authors/:id/edit(.:format)              authors#edit
         author GET    /authors/:id(.:format)                   authors#show
                PATCH  /authors/:id(.:format)                   authors#update
                PUT    /authors/:id(.:format)                   authors#update
                DELETE /authors/:id(.:format)                   authors#destroy
          books GET    /books(.:format)                         books#index
                POST   /books(.:format)                         books#create
       new_book GET    /books/new(.:format)                     books#new

Это должно дать вам все, что вынужно управлять авторами и книгами.

2 голосов
/ 26 октября 2019

Вы создаете безымянный маршрут. Я думаю, что вы хотите в вашей конкретной ситуации:

  resources :books, only: [:index, :show, :create], param: :author

Это даст:

                   Prefix Verb URI Pattern                                                                              Controller#Action
                    books GET  /books(.:format)                                                                         books#index
                          POST /books(.:format)                                                                         books#create
                     book GET  /books/:author(.:format)                                                                 books#show

Это не кажется мне RESTful. Я думаю, что вы действительно хотите вложенный ресурс между книгами и авторами. Ознакомьтесь с руководствами Rails по маршрутизации для получения дополнительной информации: https://guides.rubyonrails.org/routing.html

0 голосов
/ 26 октября 2019

Это books_author_path, скорее всего.

Просто помните, что вы делаете, это совсем не хорошая практика. (Это на самом деле за ужасные рамки для Coc, такие как Ruby).

Прежде всего, вложенные новые маршруты хороши, но вложенные маршруты создания обычно считаются плохими.

Во-вторых, почему books / author_id / create создает книгу?

Это должны быть авторы / author_id / books / new to books / create

Зайдите в консоль и введите "rails route", и она скажет вам, что такое все URL помощника

0 голосов
/ 26 октября 2019

Я не понимаю, как post '/books/:author/create', to: 'books#create' дает вам POST /books/:author(.:format) books#create.

Если вы хотите назвать свои пользовательские маршруты, добавьте имя с опцией :as: get 'something', to: 'controller#action', as: 'something', чтобы получить "thing_path "как действительный помощник.

Обратите внимание, что вы уходите от маршрутов RESTful, если вы хотите, чтобы рельсы делали то, что обычно делают (например, помощники по именованным маршрутам), вы должны придерживаться его соглашений: https://guides.rubyonrails.org/routing.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...