具有复合键参数的 ngResource 查询
ngResource query with composite key parameter
我有一个资源 Answer
,它有一个由 QuestionnaireId
和 QuestionId
组成的复合键。 ngResource代码如下:
function answerResource($resource) {
return $resource("/api/answers/:questionnaireId/:questionId",
{
questionnaireId: "@questionnaireId",
questionId: "@questionId"
}
);
}
我想用问卷 Id 查询此资源并取回所有答案。如果我使用:
answerResource.query(
{
questionnaireId: questionnaireId
}
);
那么请求的url是:
/api/answers/123
当我希望它成为:
/api/answers?questionnaireId=123
否则,我有两条路线需要为查询搜索处理——一条在查询字符串中带有 Id,另一条带有 Id 作为 url 路径的一部分。 (我还对搜索文本进行查询,其中问卷 ID 可能不存在,这将使用 url 之类的 /api/answers?q=sometext
)。
当然任何 .query
参数都应该作为查询字符串传递,而不是作为路由的一部分。我如何获得所需的行为?
遇到了类似的问题,但我在处理复合键(项目、序列)。
1- html.erb:从 https://spin.atomicobject.com/2013/11/22/pass-rails-data-angularjs/
借用选项 2
这样我就可以在 .js 脚本中获取我已经拥有的 .erb 表单中的项目(我正在根据要求使用 angularjs 做某种 "manage details -- crud")
2- 在控制器 .js 文件中,我使用 document.getElementById 和 getAttribute 从 html 元素中的自定义数据中获取值,并将其连接到请求:'/items?personId='+div.getAttribute("data-personId")+'&format=json'
3- 在 items_controller 索引操作中,默认情况下 rails g 不需要参数并获取所有项目,然后我不得不问
如果参数[:personId].存在?
@items = Item.where(personId: params[:personId])
别的
抓取所有物品
结束
这可行,但我不确定这是否是最佳方法,因为我是 angularjs 的新手。
正在解决这个问题,还不知道如何删除记录。
我能想到的最佳选择是在资源上创建一个新的 search
方法,它没有 url:
中的参数
// normal resource definition here...
,{
search: {
method: "GET",
url: "/api/answers",
isArray: true
}
}
使用复合键值调用它会将它们附加为查询字符串参数,而不是 url 的一部分,例如/api/answers?questionnaireId=123
$resource 创建路径而不是查询字符串,因为您定义了占位符:
return $resource("/api/answers/:questionnaireId/:questionId"..
如果你从资源级别删除它们然后调用$resource.query({param: value})你可以创建查询字符串,你也可以为单个$resource指定更多的操作来执行不同的请求覆盖操作url 属性.
我创建了一个简单(且非常快速)的示例可能会帮助您理解:
工作示例:https://jsfiddle.net/Nedev_so/b71feyc6/19/
编辑:
在你发表评论后我明白了你的需求,所以
资源工厂:
//only for example purpose
var answersBaseUrl = "https://example.com/api/answers";
var answerTemplateUri = commentsBaseUrl + '/:questionnaireId/:questionId'
var params = {questionnaireId: '@_questionnaireId',questionId: '@_questionId'};
var res = $resource(answerTemplateUri, params,{
one :{
method: "GET",
},
all: {
method: "GET",
url: answersBaseUrl,
isArray: true
}
});
return res;
});
然后在你的控制器中:
//get answers by questionnaire
//GET /answers?questionnaireId=123
$scope.answersByQuestionnaire = answers.all({questionnaireId: 123});
//get answers by question
//GET /answers?questionId=123
$scope.answersByQuestion = answers.all({questionId:123});
//get single answer by questionnaire and question
//GET /answers/123/123
$scope.answer = answers.one({questionnaireId: 123,questionId:123 });
(检查网络日志,您可以看到预期的行为)
我有一个资源 Answer
,它有一个由 QuestionnaireId
和 QuestionId
组成的复合键。 ngResource代码如下:
function answerResource($resource) {
return $resource("/api/answers/:questionnaireId/:questionId",
{
questionnaireId: "@questionnaireId",
questionId: "@questionId"
}
);
}
我想用问卷 Id 查询此资源并取回所有答案。如果我使用:
answerResource.query(
{
questionnaireId: questionnaireId
}
);
那么请求的url是:
/api/answers/123
当我希望它成为:
/api/answers?questionnaireId=123
否则,我有两条路线需要为查询搜索处理——一条在查询字符串中带有 Id,另一条带有 Id 作为 url 路径的一部分。 (我还对搜索文本进行查询,其中问卷 ID 可能不存在,这将使用 url 之类的 /api/answers?q=sometext
)。
当然任何 .query
参数都应该作为查询字符串传递,而不是作为路由的一部分。我如何获得所需的行为?
遇到了类似的问题,但我在处理复合键(项目、序列)。
1- html.erb:从 https://spin.atomicobject.com/2013/11/22/pass-rails-data-angularjs/
借用选项 2
这样我就可以在 .js 脚本中获取我已经拥有的 .erb 表单中的项目(我正在根据要求使用 angularjs 做某种 "manage details -- crud")
2- 在控制器 .js 文件中,我使用 document.getElementById 和 getAttribute 从 html 元素中的自定义数据中获取值,并将其连接到请求:'/items?personId='+div.getAttribute("data-personId")+'&format=json'
3- 在 items_controller 索引操作中,默认情况下 rails g 不需要参数并获取所有项目,然后我不得不问
如果参数[:personId].存在? @items = Item.where(personId: params[:personId]) 别的 抓取所有物品 结束
这可行,但我不确定这是否是最佳方法,因为我是 angularjs 的新手。 正在解决这个问题,还不知道如何删除记录。
我能想到的最佳选择是在资源上创建一个新的 search
方法,它没有 url:
// normal resource definition here...
,{
search: {
method: "GET",
url: "/api/answers",
isArray: true
}
}
使用复合键值调用它会将它们附加为查询字符串参数,而不是 url 的一部分,例如/api/answers?questionnaireId=123
$resource 创建路径而不是查询字符串,因为您定义了占位符:
return $resource("/api/answers/:questionnaireId/:questionId"..
如果你从资源级别删除它们然后调用$resource.query({param: value})你可以创建查询字符串,你也可以为单个$resource指定更多的操作来执行不同的请求覆盖操作url 属性.
我创建了一个简单(且非常快速)的示例可能会帮助您理解:
工作示例:https://jsfiddle.net/Nedev_so/b71feyc6/19/
编辑: 在你发表评论后我明白了你的需求,所以
资源工厂:
//only for example purpose
var answersBaseUrl = "https://example.com/api/answers";
var answerTemplateUri = commentsBaseUrl + '/:questionnaireId/:questionId'
var params = {questionnaireId: '@_questionnaireId',questionId: '@_questionId'};
var res = $resource(answerTemplateUri, params,{
one :{
method: "GET",
},
all: {
method: "GET",
url: answersBaseUrl,
isArray: true
}
});
return res;
});
然后在你的控制器中:
//get answers by questionnaire
//GET /answers?questionnaireId=123
$scope.answersByQuestionnaire = answers.all({questionnaireId: 123});
//get answers by question
//GET /answers?questionId=123
$scope.answersByQuestion = answers.all({questionId:123});
//get single answer by questionnaire and question
//GET /answers/123/123
$scope.answer = answers.one({questionnaireId: 123,questionId:123 });
(检查网络日志,您可以看到预期的行为)