Rails ActionController::ParameterMissing 在 Ember 中创建新记录时出错
Rails ActionController::ParameterMissing error when creating new record in Ember
Rails 5.2 与 fast_jsonapi 1.5,Ember 3.4
我在 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 相互理解的诀窍是什么?由于 ember 在有效负载中发送 "type",我能否让 Rails 了解这是模型,从而满足我设置的 "tag" 存在的要求在参数中?
重读 Ember 中的 action controller overview I learned I had to include the 'Content-Type': 'application/json'
header in my request. I accomplished this by customizing my application adapter 后:
// 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
希望这对其他人有帮助。
在 ember 3.26 中你可以这样做 :
export default class ApplicationAdapter extends JSONAPIAdapter {
headers = {
'Content-Type': 'application/json'
}
而不是
export default DS.JSONAPIAdapter.extend({
init() {
this._super(...arguments);
this.set('headers', {
'Content-Type': 'application/json'
});
Rails 5.2 与 fast_jsonapi 1.5,Ember 3.4
我在 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 相互理解的诀窍是什么?由于 ember 在有效负载中发送 "type",我能否让 Rails 了解这是模型,从而满足我设置的 "tag" 存在的要求在参数中?
重读 Ember 中的 action controller overview I learned I had to include the 'Content-Type': 'application/json'
header in my request. I accomplished this by customizing my application adapter 后:
// 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
希望这对其他人有帮助。
在 ember 3.26 中你可以这样做 :
export default class ApplicationAdapter extends JSONAPIAdapter {
headers = {
'Content-Type': 'application/json'
}
而不是
export default DS.JSONAPIAdapter.extend({
init() {
this._super(...arguments);
this.set('headers', {
'Content-Type': 'application/json'
});