Проблема с отправкой FormData в Rails API с сильными параметрами

Я хочу создать персонажа с именем и аватаром. Вот мой код:

CharacterApi.js, в котором я выполняю свой сетевой вызов

function addCharacter(name, avatar) {
  const data = new FormData();
  data.append(‘name’, name);
  data.append(‘avatar’, avatar);

  return authenticatedFetch({
    path: '/teams/characters’,
    method: 'post',
    data
  });
}

characters_controller.rb

def create
  @character = @character.new(character_params)

  if @character.save
    render :show
  else
    render json: @character.errors, status: :unprocessable_entity
  end
end

[. . .]

private

def character_params
  params.fetch(:character, {}).permit(:name, :avatar)
end

Что, когда я делаю запрос на создание, выдает ошибку 422: unprocessable entity. Однако отладки показали мне, что на самом деле отправляются правильные параметры, и выполнение следующих действий снова заставляет все работать нормально:

def create
  @character = @characters.new
  @character.name = params[:name]
  @character.avatar = params[:avatar]

[. . .]
end

Несмотря на то, что этот второй метод работает, он не очень практичен для меня, так как я хотел бы добавить еще несколько параметров в будущем.

Если я отправлю параметры как простой JSON, я не смогу получить ни одного файла (всегда дает мне нулевое значение), но на этот раз работает первый метод:

При этом я не могу отправлять изображения или какие-либо файлы, но исходный синтаксис rails снова работает

function addCharacter(name, avatar) {
  return authenticatedFetch({
    path: '/teams/characters’,
    method: 'post',
    data: {name, avatar}
  });
}

Есть ли причина, по которой короткий синтаксис @character.new(character_params) не работает при отправке FormData?

Я использую несущую волну для обработки файлов в API рельсов. Заранее благодарю за любую помощь!


person KawaLo    schedule 10.07.2019    source источник


Ответы (1)


Вы неправильно используете строгие параметры.

Это должно быть:

def character_params
  params.require(:character).permit(:name, :avatar)
end
person chumakoff    schedule 10.07.2019