#ruby-on-rails #reactjs #react-redux
#ruby-on-rails #reactjs #реагировать-redux
Вопрос:
У меня возникла проблема с отправкой моих данных из формы во внешнем интерфейсе. Каждый раз, когда я отправляю форму, я получаю недопустимый параметр: :рецепт
Мне сказали убедиться, что мои атрибуты в моем интерфейсе соответствуют тому, что было в сильных параметрах бэкэнда.
Вот что есть в моем контроллере для моего действия создания и моих сильных параметров
class RecipesController < ApplicationController
def create
recipe = Recipe.create(recipe_params)
if recipe.save
render json: recipe
else
render json: { error: "Couldn't save" }
end
end
private
def recipe_params
params.permit(:category_id,:name,:ingredients,:chef_name,:origin,category_attribute:[:category])
end
end
И вот мой интерфейс React, в котором я ввожу информацию в форме
примечание я удалил обработчики событий для этого фрагмента кода, но оставил обработчик отправки, чтобы сократить это объяснение
import React, { Component } from 'react'
import Categories from './Categories.js'
class RecipeInput extends Component{
constructor(props){
super(props)
this.state = {
category: [],
categoryId: '',
name:'',
ingredients: '',
chef_name: '',
origin: ''
}
this.handleNameChange.bind(this)
this.handleOriginChange.bind(this)
this.handleChefChange.bind(this)
this.handleIngChange.bind(this)
}
componentDidMount(){
let initialCats = [];
const BASE_URL = `http://localhost:10524`
const CATEGOREIS_URL =`${BASE_URL}/categories`
fetch(CATEGOREIS_URL)
.then(resp => resp.json())
.then(data => {
initialCats = data.map((category) => {
return category
})
console.log(initialCats)
this.setState({
category: initialCats,
})
});
}
handleSubmit = (event) =>{
event.preventDefault();
this.props.postRecipes(this.state)
this.setState({
categoryId: '',
name:'',
ingredients: '',
chef_name: '',
origin: ''
})
}
render(){
return(
<div>
<form onSubmit={this.handleSubmit}>
<Categories category={this.state.category}/>
<div>
<label for='name'>Recipe Name:</label>
<input type='text' value={this.state.name} onChange={this.handleNameChange} />
</div>
<div>
<label for='name'>Country Origin:</label>
<input type='text' value={this.state.origin} onChange={this.handleOriginChange} />
</div>
<div>
<label for='name'>Chef Name:</label>
<input type='text' value={this.state.chef_name} onChange={this.handleChefChange} />
</div>
<div>
<label for='name'>Ingredients:</label>
<textarea value={this.state.ingredients} onChange={this.handleIngChange} />
</div>
<input value='submit' type='submit'/>
</form>
</div>
)
}
}
export default RecipeInput
Я просто немного не понимаю, куда идти дальше. Правильно ли я сопоставляю атрибуты?
Редактировать Я забыл включить свою функцию postRecipes с моими отправками на месте
export const postRecipes = (recipe)=>{
const BASE_URL = `http://localhost:10524`
const RECIPES_URL =`${BASE_URL}/recipes`
const config = {
method: "POST",
body:JSON.stringify(recipe),
headers: {
"Accept": "application/json",
"Content-type": "application/json"
}
}
//category field
return(dispatch)=>{
fetch(RECIPES_URL,config)
.then(response =>
response.json())
.then(resp => {
dispatch({
type: 'Add_Recipe',
payload:{
category:resp.category,
name: resp.name,
ingredients: resp.ingredients,
chef_name: resp.chef_name,
origin: resp.origin,
categoryId: resp.categoryId
}
})
})
//.then(response => <Recipe />)
.catch((error) => console.log.error(error))
}
}
Редактировать
Вот мой редуктор, который определяет мое действие добавления рецепта для полезной нагрузки.
export default function manageRecipes(state={
recipes:[],
category:[],
}, action){
switch(action.type){
case 'Add_Recipe':
const recipe = {
name: action.name,
ingredients: action.ingredients,
chef_name: action.chef_name,
origin: action.origin,
categoryId: action.categoryId,
category: action.category,
// id: cuidFn()
}
return{
...state,
recipes: [...state.recipes, recipe],
}
case 'Delete_Recipe':
const recipes = state.recipes.filter(recipe => recipe.id !== action.id)
return {...state, recipes}
case 'Add_Catagory':
const cat = {
name: action.name
}
return{
...state,
category: [...state.category, cat],
}
default:
return state
}
}
Комментарии:
1.
params.permit
не перечисляет этот параметр, следовательно, он не разрешен. Вы должны дважды проверить свой формат ввода и разрешить нужные параметры.2. Похоже, ваша проблема не в серверной части. В сообщении с ошибкой показано, что ваше приложение rails получает что-то подобное только
{"recipe": {}}
от вашего приложения react. Можете ли вы проверить фактическую полезную нагрузку, которую вы отправляете, чтобы посмотреть, как это выглядит?3. @DanielSindrestean извините, что вернулся так поздно, я только что вернулся домой. Я обновлю вопрос с помощью своего редуктора.
4. @Stitch Это не то, что я имел в виду. Проблема, по-видимому, заключается в разнице между тем, какие данные вы должны отправлять из интерфейса, и тем, что вы получаете в серверной части. Например, попробуйте зарегистрировать
config
объект перед его отправкой.
Ответ №1:
попробуйте сделать это в своем бэкэнде
def recipe_params
params.require(:recipe).permit(
:category_id, :name,:ingredients, :chef_name,
:origin,category_attribute:[:category]
)
end
Комментарии:
1. Итак, я пробовал это раньше и пробовал снова на случай, если я где-то что-то изменил раньше, и я получаю ActionController::ParameterMissing (параметр отсутствует или значение пустое: recipe)
2. это потому, что параметры, которые вы отправляете из внешнего интерфейса, не выглядят так же, как серверная часть, попробуйте это в вашем интерфейсе: { рецепт: {category_id: 1, имя: ‘ваше имя’, ….. } }