【问题标题】:Ember unknown relationshipEmber 未知关系
【发布时间】:2020-03-18 19:21:27
【问题描述】:

我目前正在使用 Rails + Ember 3.12 构建软件,但遇到了一个奇怪的问题。

我的模型如下:

// test-case-run
import DS from 'ember-data';
const { Model } = DS;

export default Model.extend({
  testCase: DS.belongsTo('test-case'),
  testCaseRunLogs: DS.hasMany('test-case-run-logs')
});

// test-case-run-log
import DS from 'ember-data';
const { Model } = DS;

export default Model.extend({
  testCaseRun: DS.belongsTo('test-case-run'),
  payload: DS.attr('')
});

而且,我的后端正在返回以下负载:

{
  "data": {
    "id": "83",
    "type": "test_case_run",
    "relationships": {
      "test_case": {
        "data": {
          "id": "90",
          "type": "test_case"
        }
      },
      "test_case_run_logs": {
        "data": []
      }
    }
  }
}
{
  "data": {
    "id": "83",
    "type": "test_case_run",
    "relationships": {
      "test_case": {
        "data": {
          "id": "90",
          "type": "test_case"
        }
      },
      "test_case_run_logs": {
        "data": [
          {
            "id": "426",
            "type": "test_case_run_log"
          }
        ]
      }
    }
  },
  "included": [
    {
      "id": "426",
      "type": "test_case_run_log",
      "attributes": {
        "payload": "SCREENSHOT"
      },
      "relationships": {
        "test_case_run": {
          "data": {
            "id": "83",
            "type": "test_case_run"
          }
        }
      }
    }
  ]
}

我有一个自定义适配器定义:

  pathForType(type) {
    return underscore(pluralize(type));
  }

所以,我认为一切都应该顺利。

但是,当我进入 ember 检查器时,我得到了以下信息:

看来我的关系没有正确加载。 而且,我无法访问任何数据,例如:

log.get('testCaseRun') // that is null 
run.get('testCaseRunLogs.length') // it returns 0 

这很奇怪,因为我的记录加载到了商店中,但没有加载它们的关系。 我不知道如何解决这个问题,因为我可以从 ember 获得的信息量非常有限(没有错误,格式看起来不错,......)。

有人可以帮助我了解我的电话有什么问题吗?我已经尝试了很多事情,例如重命名我的模型,但这并没有改善这种情况。

此外,这个模型是唯一一个,我有问题。我所有的其他型号都没有这个问题。所以,这有点奇怪。

非常感谢

【问题讨论】:

    标签: javascript ruby-on-rails ember.js json-api


    【解决方案1】:

    <(unknown):ember264> 中的unknown 指的是类的名称。这并不意味着您的关系没有正确加载。它只是使用匿名类的 Ember Data。

    要查看关系数据,您可以单击该字符串,然后单击content。另一种选择是使用右上角的$E 链接将完整记录传递到控制台。之后,您可以与控制台上的记录进行交互,例如做一个$E.get('testCaseRun.id')

    顺便说一句:如果模型名称与 dasherized 属性名称匹配,则无需在关系定义中显式声明模型名称。所以testCaseRun: DS.belongsTo('test-case-run')testCaseRun: DS.belongsTo() 是一样的。

    【讨论】:

    • 谢谢。很高兴知道。我认为正确加载时它应该是我的班级的名称。但不幸的是,使用 $E 助手给了我一个空关系(这些是示例中的 log 和 rum 变量)。
    【解决方案2】:

    尽量用不带's'的模型名声明hasMany关系

    testCaseRunLogs: DS.hasMany('test-case-run-log')
    

    【讨论】:

    • 感谢您的回答。不幸的是,这并不能解决问题:/
    【解决方案3】:

    终于,我找到了问题的答案。

    问题是我使用的是“下划线”形式的关系:

    "included": [
        {
          "id": "426",
          "type": "test_case_run_log", <= HERE
          "attributes": {
            "payload": "SCREENSHOT"
          },
          "relationships": {
            "test_case_run": {
              "data": {
                "id": "83",
                "type": "test_case_run" <= HERE
              }
            }
          }
        }
      ]
    

    而且,更改 pathForType 还不够。 所以,我让我的后端使用破折号。而且,它奏效了。

    【讨论】:

    • 正确,JSON:API 使用破折号作为所有 type 字段的单词分隔符,并匹配 Ember 数据类型名称中使用的内容。我不希望这可以更改或配置,因为它是协议的核心部分。正如您正确指出的那样,更改后端使用的路径与此问题无关。
    • 我认为 Ember Data 会为您标准化这一点。需要检查。 @RichardViney JSON:API 与命名规则无关。它在其文档中使用 dasherized 形式已经有一段时间了。但它最近更改为 camelCase 并添加了使用那个的建议。
    猜你喜欢
    • 2012-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    • 2018-07-05
    相关资源
    最近更新 更多