Удаление записи из вложенного рельса ресурса - получение NoMethodError - PullRequest
0 голосов
/ 12 мая 2018

У меня есть два контроллера: 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 не пройдут. Это, очевидно, не имеет смысла, но я не могу понять, где я иду не так. Кто-нибудь может указать на мою ошибку?

1 Ответ

0 голосов
/ 12 мая 2018

Вам нужны вложенные параметры service на пути уничтожения:

<%= link_to "Delete Service", vendor_service_path(current_vendor, service), method: :delete %>

Ваша первая версия метода destroy должна работать таким образом.

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