React-Redux / Rails: запись не будет удалена

#ruby-on-rails #reactjs #redux

#ruby-on-rails #reactjs #redux

Вопрос:

Я интегрирую функцию удаления как часть всей области CRUD, и я не могу удалить свою запись / объект, когда нажимаю Удалить рецепт. Кстати, для этого используются React-Redux и Rails.

Это пример того, что моя серверная консоль сообщает мне, когда я пытаюсь удалить свой рецепт / запись / объект во внешнем интерфейсе:

 ActiveRecord::RecordNotFound (Couldn't find Recipe with 'id'={:id=>"2"}):
  
app/controllers/recipes_controller.rb:10:in `show'
Started GET "/recipes/2" for 127.0.0.1 at 2021-01-19 21:22:51 -0600
Processing by RecipesController#show as */*
  Parameters: {"id"=>"2"}
  Recipe Load (0.1ms)  SELECT "recipes".* FROM "recipes" WHERE "recipes"."id" = ? LIMIT ?  [["id", nil], ["LIMIT", 1]]
  ↳ app/controllers/recipes_controller.rb:10:in `show'
Completed 404 Not Found in 1ms (ActiveRecord: 0.1ms | Allocations: 824)
 

Пока что вот мое действие удаления (удар):

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

    return (dispatch) => {
        
        fetch(`${RECIPES_URL}/${recipeId}`)
          .then(response =>{ return response.json()})
          .then(id => { return dispatch({ type: 'Delete_Recipe', id })});
         
          
      };
       
  }
 

Вот мой редуктор:

   case 'Delete_Recipe':
            return{
                recipes: state.recipes.filter(recipe => recipe.id !== action.payload)
            }
        
 

В моей консоли браузера я получаю следующее:

     
GET
    http://localhost:10524/recipes/1
Status404
Not Found
VersionHTTP/1.1
Transferred16.69 KB (16.37 KB size)
Referrer Policyno-referrer-when-downgrade
 

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

Вот где я импортировал действие deleteRecipe и сопоставил отправку с реквизитами

 class RecipesContainer extends Component{
    constructor(props){
        super(props)
    }

    componentDidMount(){
        this.props.getRecipes()
      }
    

    render(){
        return (
            <div>
               <RecipeInput postRecipes={this.props.postRecipes} /> 
               <RecipeList recipes={this.props.recipes} deleteRecipe={this.props.deleteRecipe}/>
            </div>
        )
    }

    

}

const mapStateToProps = state =>{
    return{
        recipes: state.recipes
    }
}


const mapDispatchToProps = dispatch =>{
    return{
    postRecipes: (recipe) => dispatch(postRecipes(recipe)),
    getRecipes: () => dispatch(getRecipes()),
    // getCategories: () => dispatch(getCategories())
    deleteRecipe: (id) => dispatch(deleteRecipe(id))
    }
}



export default connect(mapStateToProps,mapDispatchToProps)(RecipesContainer)
 

Вот мой компонент recipeList

 import React, {Component} from 'react';
import Recipe from './Recipe.js'

class RecipeList extends Component {



render() {
   const { recipes } = this.props
   return (
    
      
    <div>
      
      {recipes.map(recipe =>  {return <Recipe recipe={recipe} {...recipe} deleteRecipe={this.props.deleteRecipe} key={recipe.id} />})}
    </div>
   )
    
  }
}

export default RecipeList;
 

И вот мой компонент рецепта

 import React, {Component} from 'react';
import Recipe from './Recipe.js'

class RecipeList extends Component {



render() {
   const { recipes } = this.props
   return (
    
      
    <div>
      
      {recipes.map(recipe =>  {return <Recipe recipe={recipe} {...recipe} deleteRecipe={this.props.deleteRecipe} key={recipe.id} />})}
    </div>
   )
    
  }
}

export default RecipeList;
 

Кто может указать на мою проблему?

Комментарии:

1. Ваше действие не имеет полезной нагрузки, вы должны изменить действие. полезная нагрузка для action.id : state.recipes.filter(recipe => recipe.id !== action.id) .

2. К сожалению, это не сработало:-(

3. добавьте метод УДАЛЕНИЯ в свой fetch , fetch( $ {RECIPES_URL}/ $ {RecipeID} , { method: 'DELETE' })

4. Это привело к проблеме CORS, но проверка прямо сейчас

5. Это должно быть так. У меня проблема с cors, но я знаю, как действовать дальше. Спасибо

Ответ №1:

Ошибка из-за неправильного метода HTTP, поэтому запрос не отправляется для исправления действия контроллера Rails, запрос на удаление должен использовать DELETE метод, поэтому функция выборки должна быть:

 fetch(${RECIPES_URL}/${recipeId}, { method: 'DELETE' })