Rails ActionController :: ParameterMissing ошибка при создании новой записи в Ember - PullRequest
0 голосов
/ 12 ноября 2018

Rails 5.2 с fast_jsonapi 1.5, Ember 3.4

Я создаю новую запись Tag в Ember:

let newTag = this.get('store').createRecord('tag', {
  name: this.get('name')
});
newTag.save();

При этом отправляется следующий json (как показано на вкладке «Сеть» Chrome в качестве полезной нагрузки запроса):

{"data":{"attributes":{"name":"photos","created_at":null,"updated_at":null},"type":"tags"}}

Но Rails только получает (что подтверждается распечаткой параметров в методе создания TagsController):

{"controller"=>"tags", "action"=>"create"}

И выдает следующую ошибку:

ActionController::ParameterMissing (param is missing or the value is empty: tag)

А вот код моего контроллера:

# app/controllers/tags_controller.rb
class TagsController < ApplicationController
  def create
    tag = Tag.create!(tag_params)
    render json: {status: "success"}
  end

  private

  def tag_params
    puts params
    params.require(:tag).permit(:name)
  end
end

Что за хитрость, чтобы заставить уголь и рельсы понять друг друга? Так как ember отправляет «тип» в полезной нагрузке, могу ли я заставить Rails понять, что это модель, и, таким образом, выполнить требование, которое я установил, чтобы «тег» присутствовал в параметрах?

1 Ответ

0 голосов
/ 18 ноября 2018

После перечитывания обзора контроллера действия Я узнал, что мне нужно включить заголовок 'Content-Type': 'application/json' в мой запрос. Я достиг этого, настроив мой адаптер приложения в Ember:

// app/adapters/application.js

import DS from 'ember-data';

export default DS.JSONAPIAdapter.extend({
  init() {
    this._super(...arguments);
    this.set('headers', {
      'Content-Type': 'application/json'
    });
  }
});

Следующей проблемой, с которой мне пришлось столкнуться, было изменение использования сильных параметров в контроллере Rails:

# app/controllers/tags_controller.rb

def tag_params
  params.require(:data).require(:attributes).permit(:name)
end

Надеюсь, это поможет кому-то еще.

...