2014-02-07 4 views
0

Я новичок в Rails. Я надеюсь, что кто-то может мне помочь, и я уверен, что это логично, как только я понял, почему он не работает, как я ожидаю.ActiveRecord :: RecordNotFound in IngredientsController # destroy

У меня есть метод уничтожения, который на самом деле wprks. Он уничтожает то, что я хочу, но я получаю сообщение об ошибке, что идентификатор не найден.

Заранее спасибо.

Ошибка:

ActiveRecord :: RecordNotFound в IngredientsController # уничтожают Не удалось найти ингредиент с ID = 38

Мой контроллер ингредиент:

def destroy 
    @ingredient = Ingredient.find(params[:id]) 
    @ingredient.destroy 
    flash[:notice] = @ingredient.ingredient + ' is succesvol verwijderd' 
    redirect_to '/recipes/' 
end 

Мои маршруты:

Website::Application.routes.draw do 

     root 'recipes#index' 

     resources :recipes, only: [:destroy, :edit, :update, :create, :new, :index, :show] 
     do 
     resources :ingredients 
     end 

     get 'ingredients/:id/destroy' => 'ingredients#destroy' 
     get '/find' => 'recipes#find' 

     get 'recipes/find' => 'recipes#find' 
     get 'recipes/:id/destroy' => 'recipes#destroy' 
     post 'recipes/:id/edit' => 'recipes#update' 

     get 'recipes/edit' => 'recipes#edit' 
     get 'recipes/update' => 'recipes#index' 
     post 'recipes/new' => 'recipes#create' 

     get 'ingredients/show' => 'ingredients#show' 
     get 'ingredients/create' => 'recipes#edit' 
     get 'ingredients/edit' => 'ingredients#edit' 

Код в html.erb

<table> 
<th>ing_id</th> 
<th>Ingredient</th> 
<th>Hoeveelheid</th> 
<th>Eenheid</th> 
<th>recipe_id</th> 
<th>delete</th> 
<% @ingredient.each do |ingredients| %> 

    <tr> 
    <td><%= ingredients.id %></td> 
    <td><%= ingredients.ingredient %></td> 
    <td><%= ingredients.amount %></td> 
    <td><%= ingredients.unit %></td> 
    <td><%= ingredients.recipe_id %></td> 
    <td><a href='/ingredients/<%= ingredients.id %>/destroy'>Delete</a></td> 
    </tr> 

<% end %> 
+0

U используется @ingredient вспышка после уничтожения его –

+0

сделать резервную копию этого, прежде чем уничтожить его и использовать эту резервную копию экземпляра вспышки –

+0

Или просто поменять местами строки , 'flash [: notice]' и '.destroy' – rlecaro2

ответ

1

Поскольку вы уже уничтожили ваш экземпляр @ingredient, прежде чем назвать вспышкой, ваша вспышка [: извещение] не может найти @ingredient для визуализации. Сделайте это вместо этого:

flash[:notice] = @ingredient.ingredient + ' is succesvol verwijderd' 
@ingredient.destroy 
+0

Привет, спасибо за быстрый ответ. Я пробовал ваше решение, но, к сожалению, это не проблема. Я даже удалил флеш-уведомление, тоже не работал. Я сделал то же самое для рецепта.Уничтожьте и заметьте после него, как в моем компоненте_controller. Там он работает. Поэтому я смотрю на экран и не могу понять это. – Derooie

+0

Не могли бы вы включить трассировку стека? – miahabdu

0

Был ли у отметки @ingredient = Ingredient.find(params[:id]), если он доступен. Проверьте параметры, которые появляются из вида. Попробуйте использовать тот же код в консоли rails, чтобы проверить результаты и содержимое базы данных.

0

У меня есть подозрение, что действие destroy не является проблемой. Как вы сказали, он работает правильно и удаляет ресурс. На что он похож:

Вы пытаетесь получить доступ к удаленной модели Ингредиента после ее уничтожения. Это вызовет ошибку ActiveRecord::RecordNotFound, поскольку первое, что делает действие destroy, - это выборка ресурса.

или

Вы пытаетесь удалить ту же модель Ингредиент снова. Если вы находитесь на странице показа ресурса и обновите его после уничтожения ресурса, вы получите ActiveRecord::RecordNotFound, так как ресурс больше не существует.

1

Это была проблема в моем перенаправлении (или, честно говоря, может быть, иногда и в других случаях я много пробовал). Но то, что в конце концов работал получал мой ingredients_controller глядя, как это:

def destroy 
    @ingredient = Ingredient.find(params[:id]) 
    @ingredient.destroy 
    flash[:notice] = @ingredient.ingredient + ' is succesvol verwijderd' 
    redirect_to edit_recipe_path(@recipe) 
    end 
Смежные вопросы