我正在编写一个API,以email_id
查找用户。
我在将电子邮件作为参数发送时收到错误。
routes.rb中:
Rails.application.routes.draw do
namespace :api do
resources :users, only: [:show, :index] , param: :email
end
end
当我将电子邮件作为参数发送时,我收到了错误消息。网址为http://localhost:3000/api/users/test@abc.com:
ActiveRecord::RecordNotFound in Api::UsersController#show
Couldn't find User with 'id'={:email=>"test@abc"}
这是我的路线路径:
api_users_url GET /api/users(.:format) api/users#index
api_user_url GET /api/users/:email(.:format) api/users#show
答案 0 :(得分:3)
在您的电子邮件中,有一个点.
,如@gmail.com
。这个点是个问题。
默认情况下,Rails路由中的动态段不接受点。
结果将是:
{
"sender"=>"emai@gmail",
"format"=>"com"
}
而不是
{
"sender"=>"emai@gmail.com"
}
在routes.rb
:
get 'message/:sender', to: 'main#message_sent', constraints: { sender: /[^\/]+/} , as: 'message_sent'
重要的部分是 constraints: { sender: /[^\/]+/}
,让您通过url参数传递一个点。
答案 1 :(得分:2)
ActiveRecord::RecordNotFound in Api::UsersController#show
Couldn't find User with 'id'={:email=>"test@abc"}
您应该将show
操作更改为
def show
resource = User.find_by(email: params[:email])
render :json => resource.as_json
end
默认find
需要id
,因此您应该使用find_by
<强> OR 强>
您可以使用where
def show
resource = User.where(email: params[:email]).first
render :json => resource.as_json
end
答案 2 :(得分:0)
您正在使用密钥email
传递哈希值,并且在控制器中您通过id
找到用户。这是在这样的URL中传递电子邮件的错误方法:
api_user_url GET /api/users/:email(.:format) api/users#show
这是不安全的。您必须针对您的操作提出post
请求的路由,并在那里传递参数"email": "test@abc"
。
然后是你的行动。按email
而不是id
查找用户:
@user= User.find_by_email(params[:email])
答案 3 :(得分:0)
我在我的应用程序中遇到了类似的问题,其中我将电子邮件作为 URL 中的变量。问题是电子邮件中的点。这是我为修复它所做的:
更改了 routes.rb
文件:
get '/api/users/:email', to: 'users#show', param: :email, constraints: { email: /.*/ }
当然,当您调用端点时,必须对 URL 中的电子邮件进行编码:
ie: myemail@gmail.com => myemail%40gmail.com
使用 curl 进行测试:
curl http://localhost:3000/users/myemail%40gmail.com