Я пытаюсь установить ссылку на настраиваемое действие маршрута контроллера, но что-то делаю не так. У меня есть модель документа, которая обрабатывает загрузку документов в мое приложение 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
Я добавил больше того, что видел, из лучших ошибок
@BenPohl Имя контроллера должно быть во множественном числе: put "remove", to: "documents#remove", as: :remove
Спасибо @sovalina. Теперь у меня новая ошибка: ActiveRecord :: RecordNotFound в /documents/remove.66 Не удалось найти документ с 'id' =
Я не уверен, как передать идентификатор параметров. Я предполагаю, что об этом позаботятся некоторые из маршрутов Rails restful.
Если вы хотите, чтобы действие 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 %>
Можете добавить всю ошибку?