Пользовательский маршрут контроллера для обновления столбца active до false

Я пытаюсь установить ссылку на настраиваемое действие маршрута контроллера, но что-то делаю не так. У меня есть модель документа, которая обрабатывает загрузку документов в мое приложение CRUD. Я хочу, чтобы пользователи могли что-то «удалять», но не удалять это фактически из системы, а вместо этого обновлять столбец «активно» до значения «ложь». Затем, если кто-то с правами администратора сможет продолжить, завершите удаление. Этот процесс необходим, потому что приложение проверяется, и мы не хотим случайно удалять загруженные файлы.

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

remove_documents PUT      /documents/remove(.:format)                                                             document#remove

В моем файле маршрутов (я хочу добавить пару похожих маршрутов позже, поэтому я использовал сборку таким образом):

resources :documents do
  collection do
    put "remove", to: "document#remove", as: :remove
  end
end

В режиме указателя документов:

<%= link_to remove_documents_url(document), :method => :put do %>
  <span class = "fa fa-trash text-danger"></span>
<% end %>

Мой контроллер:

def remove
  @document = Document.find(params[:id])
  @document.active = false
  @document.save
  html { redirect_to(:back, :notice => 'Document was successfully removed.')}
end

Ссылка работает, но потом появляется следующая ошибка:

NameError at /documents/remove.75 uninitialized constant DocumentController

      raise unless e.missing_name? qualified_name_for(parent, const_name)
    end
  end
  name_error = NameError.new("uninitialized constant #{qualified_name}", const_name)
  name_error.set_backtrace(caller.reject {|l| l.starts_with? __FILE__ })
  raise name_error
end
# Remove the constants that have been autoloaded, and those that have been
# marked for unloading. Before each constant is removed a callback is sent

Можете добавить всю ошибку?

Sebastian Palma 01.05.2018 19:12

Я добавил больше того, что видел, из лучших ошибок

Ben Pohl 01.05.2018 19:15

@BenPohl Имя контроллера должно быть во множественном числе: put "remove", to: "documents#remove", as: :remove

Sovalina 01.05.2018 19:44

Спасибо @sovalina. Теперь у меня новая ошибка: ActiveRecord :: RecordNotFound в /documents/remove.66 Не удалось найти документ с 'id' =

Ben Pohl 01.05.2018 19:59

Я не уверен, как передать идентификатор параметров. Я предполагаю, что об этом позаботятся некоторые из маршрутов Rails restful.

Ben Pohl 01.05.2018 20:02
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
164
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы хотите, чтобы действие remove выполнялось на конкретном Document, измените маршруты на:

resources :documents do
  member do
    put "remove", to: "documents#remove", as: :remove
  end
end

что дает вам: remove_document PUT /documents/:id/remove(.:format)
и используйте его как:

<%= link_to remove_document_path(document), :method => :put do %>
  <span class = "fa fa-trash text-danger"></span>
<% end %>

Другие вопросы по теме