ruby-on-rails - пользовательский метод и link_to - PullRequest
0 голосов
/ 13 июня 2018

У меня есть программа с пользователями и проектами (отношение многих ко многим).Я хотел бы создать свои собственные методы: удалить все проекты от конкретного пользователя и удалить конкретный проект от конкретного пользователя, но я не могу с этим справиться.Есть (тихая большая) возможность, я не понимаю маршруты.

Ниже я вставляю код для удаления всего проекта от конкретного пользователя.

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

def delete_projects_from_user
    @user.projects.delete_all
end

В show.html.erb link_to:

<%= link_to 'Delete all projects', @user, method: :delete_projects_from_user, data: { confirm: 'Are you sure?' } %> 

И в маршрутах я пробовал среди прочего этот два варианта:

resources :users do
    get 'delete_projects_from_user', on: :member
end

или

post '/users/:id', to: 'users#delete_projects_from_user', as: :delete_projects_from_user

Первый параметр выбрасывает: «Нет совпадений маршрута [POST]»/ users / (id) "Второй вариант просто ничего не делать.

Буду благодарен за подсказку.

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Базовый формат:

<%= link_to 'DISPLAY TEXT', YOUR_ROUTE_path(@object), method:
 :HTTP_METHOD, data: { Additional html params } %>

Вот решение:

<%= link_to 'Remove All Projects', delete_projects_from_user_path(@user), method: :post, data: { confirm: 'Are you sure?' } %>

Тогда в вашем методе:

 def delete_projects_from_user
   user = user.find(params[:id])
   user.projects.delete_all
   redirect_to :back #if nothing to render  
 end

IЯ уверен, что это может помочь вам.

0 голосов
/ 13 июня 2018

Для этого

def delete_projects_from_user
  @user.projects.delete_all
end

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

.delete_all удаляет только объект и оставляетсвязанные записи в БД

и А для этого:

<%= link_to 'Delete all projects', @user, method: :delete_projects_from_user, data: { confirm: 'Are you sure?' } %>

В своем маршруте вы определили свой маршрут как пост, поэтому он должен быть

method: :post

, чтобы быть похожимthis

<%= link_to 'Delete all projects', @user, method: :post, data: { confirm: 'Are you sure?' } %>

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

<%= link_to 'Delete all projects', YOUR_ROUTE_path(@user), method: :post, data: { confirm: 'Are you sure?' } %>

Хотя рекомендуется определять этот маршрут следующим образом

delete '/users/:id', to: 'users#delete_projects_from_user', as: :delete_projects_from_user

Что касается 2-го варианта, вы также можете использовать коллекцию

resources :users do
  collection do
    delete 'user/:id', to: 'users#delete_projects_from_user', as: :delete_projects_from_user
  end
end

и изменить ссылку на

<%= link_to 'Delete all projects', delete_projects_from_user(@user), method: :delete, data: { confirm: 'Are you sure?' } %>

Оба варианта хороши, и 2-й вариант с удалениемрекомендуется

...