在我的Rails API / Angular应用程序中,我希望能够使用字段值搜索Rails表。我目前的代码如下所示,它允许通过电子邮件ID搜索用户表,并将用户记录作为JSON返回。
API /控制器/ users_controller.rb
def query # by email
queried_user = User.where(email: params[:email]).first
if !queried_user.nil?
render json: queried_user, root: false
else
render json: {error: 'Does not exist'}, status: :not_found
end
end
配置/ routes.rb中
get 'api/users/:id/query' => 'api/users#query'
示例网址
http://0.0.0.0:8080/api/users/1/query?email=testuser1@example.com
示例返回JSON
{"id":14,"title":"Dr.","first_name":"John","last_name":"Smith","email":"testuser1@example.com","job_title":"Head Bioligist","organisation":"NIH","phone_office":null,"city":null,"country":null,"approved":true,"admin":false,"template":false}
目前一切正常,但有两个问题无法解决。
我希望网址不包含:id 我发现当我将网址从网址中删除时,Rails会将查询参数视为ID。我可以通过硬编码假身份证来使其工作,但它对我来说似乎不是正确的答案。
我想将一个健康的参数哈希传递给查询方法。它应该根据哈希内容映射列。
如果 params = {email:' testuser1@example.com'} 那么它应该像现在一样工作,但其他所需的选项可能是:
{job_title: 'Manager'}
{city: 'LA', last_name: 'Smith'}
我希望我会更改此代码,但不知道如何将任意元素传递到where。
queried_user = User.where(email: params[:email])
答案 0 :(得分:1)
where方法可以接受哈希,因此您可以传递包含查询条件的param哈希。请注意,将哈希传递给where方法时,只能使用相等和范围条件。请确保您的应用程序的安全性受到保护。例如:
queried_user = User.where(params[:user])
要删除路径文件中的:id,请定义类似于此的新路由:
match 'api/users/query', to: 'users#query', as 'user_search'
然后使用' user_search_path'用于将搜索发送到用户控制器的查询操作。