Необработанное отклонение (ошибка типа): состояние.recipes не определено

#javascript #ruby-on-rails #reactjs #react-redux

#javascript #ruby-on-rails #reactjs #реагировать-redux

Вопрос:

Я просто пытаюсь удалить элемент на своей странице. Когда я удаляю элемент, я получаю это необработанное отклонение (TypeError): state.recipes — неопределенное сообщение, указывающее на мой редуктор. Когда я обновляю свою страницу, объект исчезает, и ошибка исчезает. Вопрос в том, что вызывает эту ошибку до удаления элемента?

Это то, что происходит после того, как я нажимаю кнопку удаления, когда я обновляю страницу, объект исчезает.
введите описание изображения здесь

  case 'DELETING_RECIPE_START': 
            return {
            ...state.recipes, 
            loading: true 
            }

        case 'DELETE_RECIPE_SUCCESS':
            
This line ----->  const recipes = state.recipes.filter(recipe => recipe.id !== action.payload.recipeId)
            
            return {
                ...state, recipes,
               loading: false
            
            }
 

Мне сказали, что в этом случае нужно проверить ваше действие удаления на серверной части. Когда я подключил byebug, он показывает мне, какой объект я пытаюсь удалить, так что, надеюсь, мне не о чем беспокоиться.

 def destroy
      
        recipe = Recipe.find(params[:id])
        
        unless recipe.nil?
      
          recipe.destroy
          render json: recipe
        else
          render json: { error: "Property not found" }, status: 404
        end
    end
    
 

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

 export const deleteRecipe = (recipeId) =>{
    const BASE_URL = `http://localhost:3001`
    const RECIPES_URL =`${BASE_URL}/recipes`
    debugger
    return (dispatch) => {
        
        dispatch({ type: "DELETING_RECIPE_START" })
        fetch(`${RECIPES_URL}/${recipeId}`,{method: 'DELETE'})
          .then(response =>{return response.json()})
          .then(recipeId =>  dispatch({ type: 'DELETE_RECIPE_SUCCESS', payload: recipeId }))
          .catch((error) => console.log.error(error))
    };

}
 

Последний здесь мой компонент рецепта с кнопкой удаления и связанным с ним обработчиком событий.

 class Recipe extends Component {
   
    handleOnClick(){
        this.props.deleteRecipe(this.props.recipe.id);
      }

    render(){
        
        return(
            <div>
            <h3>Name: {this.props.recipe.name}</h3>
            <p>Category:{this.props.recipe.category_id}</p>
            <p>Chef Name: {this.props.recipe.chef_name}</p>
            <p>Origin: {this.props.recipe.origin}</p>
            <p>Ingredients: {this.props.recipe.ingredients}</p>
            <button onClick={()=>this.handleOnClick()}>Delete</button>
            </div>
             
        )
    }

}

export default Recipe
 

Что я могу сделать, чтобы исправить это?

Ответ №1:

Для тех, кто заинтересован в решении. Я отдаю должное моему лидеру группы за это. Произошла некоторая реструктуризация.

Когда отладчик помещается в my, это будет указывать на то, что ключ не предоставлен для рецептов…ну вот что это означало.

Сначала мой случай DELETE_RECIPE_START был таким

 case 'DELETING_RECIPE_START': 
            return {
            
            ...state.recipes, 
            loading: true 
            }
 

Это должно было выглядеть так

 case 'DELETING_RECIPE_START': 
            return {
            
            recipe:[...state.recipes], 
            loading: true 
            }
 

Рецепт является ключом, а его текущее состояние — значением

Следующая часть поразила меня…Действие удаления не нуждалось в ответе json. Вы только указываете ему удалить идентификатор, и все.

 export const deleteRecipe = (recipeId) =>{
    const BASE_URL = `http://localhost:3001`
    const RECIPES_URL =`${BASE_URL}/recipes`

    
   
    return (dispatch) => {
        fetch(`${RECIPES_URL}/${recipeId}`, { method: 'DELETE' })
            .then(() => {
                return dispatch({ type: 'DELETE_RECIPE_SUCCESS', payload: recipeId })
            });
    };

}
 

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