2016-04-11 3 views
4

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

    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>  

ответ

4

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

<%= link_to posts_path(@post) %> 

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

2

Необходимо использовать атрибут method в link_to method. Название маршрута одно и то же, но только с различными HTTP глаголов:

<%= link_to "Update Post", post_path, method: :patch %> 
2

Так что на самом деле _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' %> 
1

Я рекомендую вам эти лекции, для меня это помогает мне многое понять. но в основном вы должны послать метод PUT, патч или удалить Routes in rails explain, patch and put for 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%> 

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

Смежные вопросы