在Rails 5 API+AMS+RSpec中如何初始化POST请求参数
解决Ember适配Rails API(AMS)中POST请求参数的问题
这问题我太熟悉了——Ember和Rails API配合时,参数格式和请求头的细节很容易卡壳,尤其是用Active Model Serializers(AMS)的时候。你现在的核心问题应该是参数结构不符合Ember+AMS的约定,加上请求头可能没配置完整,导致控制器没法正确接收参数。
1. 调整参数的嵌套结构
Ember的默认适配器(比如JSONAPIAdapter)会把请求参数包裹在对应资源的蛇形命名键下,Rails的强参数和AMS也依赖这种结构来解析。你的valid_params现在是扁平的,得改成嵌套格式:
let(:valid_params) { { shop_language: { language_id: new_language.id } } }
注:这里的shop_language要对应你控制器里处理关联的资源名,如果是直接给Shop添加Language,也可能是language,具体要看你控制器的强参数规则。
2. 补全请求头配置
POST JSON格式的请求时,必须明确设置Content-Type头,不然Rails会把参数当成普通表单数据解析,导致拿不到正确的值。把你的before块补全:
before do post "/shops/#{shop_id}/languages", params: valid_params.to_json, headers: { 'Content-Type' => 'application/json', 'Accept' => 'application/json' # 可选,但建议加上,明确告诉API你要JSON响应 } end
3. 检查控制器的强参数
确保你的控制器里已经正确配置了强参数,允许接收嵌套的参数:
# app/controllers/shop_languages_controller.rb def shop_language_params params.require(:shop_language).permit(:language_id) end
为什么要这么做?
Ember和AMS都遵循JSON API规范(或者类似的嵌套约定),扁平参数会被Rails忽略,而正确的嵌套结构能让控制器精准拿到你传入的language_id,同时AMS也能正确处理序列化逻辑。
如果还是有问题,可以在测试里打印response.body或者params的值,看看Rails实际接收到的参数是什么样的,方便排查。
内容的提问来源于stack exchange,提问作者belgoros
相关产品推荐
相关产品推荐

