У меня есть два контроллера: VendorsController и ServicesController. У поставщиков есть сервисы, и поэтому я создал вложенные маршруты:
#config/routes.rb
Rails.application.routes.draw do
devise_for :users
root "static_pages#index"
get 'start', to: 'static_pages#start'
resources :vendors do
resources :services
end
end
Сервисы перечислены на странице показа поставщиков, и поэтому я хочу, чтобы пользователь, которому принадлежит страница поставщика, мог удалить сервис (все со страницы показа поставщиков). Вот мой код для этого в контроллере служб:
#services_controller.rb
class ServicesController < ApplicationController
before_action :authenticate_user!
# some more code
def destroy
@vendor = Vendor.find_by_id(params[:vendor_id])
@service = Service.find_by_id(params[:id])
if @service.user == current_user
@service.destroy
redirect_to vendor_path(@vendor), notice: "The service has been deleted."
else
return render text: 'Not Allowed', status: :forbidden
end
end
end
А в vendor / show.html.erb:
<% current_vendor.services.each do |service| %>
<% if current_vendor.user == current_user %>
<%= link_to "Edit Service", edit_vendor_service_path(service), class: 'btn btn-primary float-right'%>
<%= link_to "Delete Service", vendor_service_path(current_vendor), method: :delete, data: {confirm: 'Are you sure? This action cannot be reversed.'}, class: 'btn btn-danger float-right'%>
<% end %>
<% end %>
Обратите внимание, что current_vendor является вспомогательным методом. Проблема состоит в том, что этот код проходит в моем тестовом наборе rspec, но на практике я получаю ошибку «NoMethodError в ServicesController # destroy. Undefined метод` user 'для nil: NilClass ". После использования pry я понимаю, что единственный способ заставить его работать на практике - это изменить метод destroy в моем контроллере Services следующим образом:
def destroy
@vendor = Vendor.find_by_id(params[:id])
@service = Service.find_by_id(params[:vendor_id])
if @service.user == current_user
@service.destroy
redirect_to vendor_path(@vendor), notice: "The service has been deleted."
else
return render text: 'Not Allowed', status: :forbidden
end
end
Как только я это сделаю, конечно, мои тесты rspec не пройдут. Это, очевидно, не имеет смысла, но я не могу понять, где я иду не так. Кто-нибудь может указать на мою ошибку?