Маршрут Rails для создания, удаления, обновления действия

Я пытаюсь понять маршрутизацию рельсов. Я прочитал руководство по рельсам, но я все еще в замешательстве. Например, у меня есть posts_controller со всеми грубыми действиями rails, как показано ниже:

                    posts GET    /posts(.:format)                     posts#index
                          POST   /posts(.:format)                     posts#create
                 new_post GET    /posts/new(.:format)                 posts#new
                edit_post GET    /posts/:id/edit(.:format)            posts#edit
                     post GET    /posts/:id(.:format)                 posts#show
                          PATCH  /posts/:id(.:format)                 posts#update
                          PUT    /posts/:id(.:format)                 posts#update
                          DELETE /posts/:id(.:format)                 posts#destroy

Как я вижу сверху, только index, new, edit and show действия имеют имя пути слева. Например, действие index имеет имя пути posts, и я могу получить URL-адрес как posts_path. И я могу использовать его в теге ссылки, как показано ниже.

<a href="<%= posts_path %>">here</a>

Но нет путей для действий создания, обновления и уничтожения. Итак, как я могу получить URL-адрес для создания действия в этом случае для ссылки ниже?

<a href="<%= ..... link to create action of post controller  %>">here</a>      

person Community    schedule 11.04.2016    source источник


Ответы (4)


Передайте путь и либо идентификатор сообщения, которое вы хотите удалить, либо объект, который вы хотите создать:

<%= link_to posts_path(@post) %>

Если вы находитесь внутри формы и у вас есть объект (@post = Post.new), то rails будет знать при отправке, что вы хотите создать, основываясь на том факте, что вы используете этот маршрут для отправки формы. Если вы хотите удалить с помощью link_to, вам нужно передать method: :delete

person toddmetheny    schedule 11.04.2016

Таким образом, на всех сгенерированных маршрутах на самом деле есть помощники _path, я добавил имена путей перед сгенерированными маршрутами ниже, сейчас я объясню разницу:

                posts GET    /posts(.:format)                     posts#index
                posts POST   /posts(.:format)                     posts#create
             new_post GET    /posts/new(.:format)                 posts#new
            edit_post GET    /posts/:id/edit(.:format)            posts#edit
                 post GET    /posts/:id(.:format)                 posts#show
                 post PATCH  /posts/:id(.:format)                 posts#update
                 post PUT    /posts/:id(.:format)                 posts#update
                 post DELETE /posts/:id(.:format)                 posts#destroy

Таким образом, любой запрос GET, который вы отправляете на сервер, может быть просто выполнен с заданным путем (поскольку GET используется по умолчанию для любой доступной ссылки), но вы все равно можете использовать помощник _path для доступа к другим маршрутам, явно указав метод, который вы используете. используя для доступа с. Например:

Index:
   <%= link_to "Index", posts_path %>

Create:
   <%= link_to "Create", posts_path, method: 'POST' %>

New:
   <%= link_to "New", new_post_path %>

Edit:
   <%= link_to "Edit", edit_post_path(post_id) %>

Show:
   <%= link_to "Show", post_path(post_id) %>

Update:
   <%= link_to "Update", post_path(post_id), method: 'POST' %>
   <%= link_to "Update", post_path(post_id), method: 'PATCH' %>

Destroy:
   <%= link_to "Destroy", post_path(post_id), method: 'DELETE' %>
person Zubatman    schedule 11.04.2016


Я рекомендую вам эти лекции, для меня это очень помогает мне понять это. но в основном вам нужно отправить метод put, patch или delete Объяснение маршрутов в rails , залатать и поставить на рельсы

<%= link_to "Update Post", posts_path(@post.id), method: :patch %>
<%= link_to "Update Post", posts_path(@post.id), method: :put %>
<%= link_to "delete Post", posts_path(@post.id), method: :delete%>

не забывайте идентификатор, это важно, потому что ваш контроллер должен знать, какой пост нужно выполнить для обновления или удаления.

person Ezequiel García    schedule 11.04.2016