Ruby on rails 无法将电子邮件作为Rails中URL中的参数发送
我正在编写一个API,通过Ruby on rails 无法将电子邮件作为Rails中URL中的参数发送,ruby-on-rails,ruby,api,ruby-on-rails-4,Ruby On Rails,Ruby,Api,Ruby On Rails 4,我正在编写一个API,通过email\u id查找用户 作为参数发送电子邮件时出错 Routes.rb: Rails.application.routes.draw do namespace :api do resources :users, only: [:show, :index] , param: :email end end 当我将电子邮件作为参数发送时,出现了一个错误。网址是: 这是我的路径: api_users_url GET /api/users(.:
email\u id
查找用户
作为参数发送电子邮件时出错
Routes.rb:
Rails.application.routes.draw do
namespace :api do
resources :users, only: [:show, :index] , param: :email
end
end
当我将电子邮件作为参数发送时,出现了一个错误。网址是:
这是我的路径:
api_users_url GET /api/users(.:format) api/users#index
api_user_url GET /api/users/:email(.:format) api/users#show
您应该将show
操作更改为以下内容
def show
resource = User.find_by(email: params[:email])
render :json => resource.as_json
end
默认情况下,find
采用id
,因此您应该使用find\u By
或
您可以使用where
def show
resource = User.where(email: params[:email]).first
render :json => resource.as_json
end
您应该将show
操作更改为以下内容
def show
resource = User.find_by(email: params[:email])
render :json => resource.as_json
end
默认情况下,find
采用id
,因此您应该使用find\u By
或
您可以使用where
def show
resource = User.where(email: params[:email]).first
render :json => resource.as_json
end
您正在使用键
email
传递散列,并且在控制器中通过id
查找用户。这是在URL中传递电子邮件的错误方式,如下所示:
api_user_url GET /api/users/:email(.:format) api/users#show
@user= User.find_by_email(params[:email])
这是不安全的。您必须使用post
请求进行路由,并传递参数“电子邮件”:test@abc“
在那里。
然后是你的行动。通过email
而不是id
查找用户,如下所示:
api_user_url GET /api/users/:email(.:format) api/users#show
@user= User.find_by_email(params[:email])
您正在使用键
email
传递散列,并且在控制器中通过id
查找用户。这是在URL中传递电子邮件的错误方式,如下所示:
api_user_url GET /api/users/:email(.:format) api/users#show
@user= User.find_by_email(params[:email])
这是不安全的。您必须使用post
请求进行路由,并传递参数“电子邮件”:test@abc“
在那里。
然后是你的行动。通过email
而不是id
查找用户,如下所示:
api_user_url GET /api/users/:email(.:format) api/users#show
@user= User.find_by_email(params[:email])
在您的电子邮件中有一个点
,如@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'
重要的部分是约束:{sender:/[^\/]+/}
,让您通过url参数传递一个点 在您的电子邮件中有一个点
,如@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'
重要的部分是约束:{sender:/[^\/]+/}
,让您通过url参数传递一个点 我在应用程序中遇到了类似的问题,在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
我在我的应用程序中遇到了一个类似的问题,我在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
您可以发布控制器的显示方法吗?class Api::UsersControllerresource.as_json end def show resource=User.find(email:params[:email])render:json=>resource.as_json end from错误,您的控制器正在尝试使用其id
查找用户,而不是email
@OptimusPette我已将id参数覆盖为email。resources:users,only:[:show,:index],param::email您可以发布控制器的show方法吗?class Api::UsersControllerresource.as_json end def show resource=User.find(email:params[:email])render:json=>resource.as_json end endfrom the error,您的控制器正在尝试使用其id
查找用户,而不是email
@OptimusPette我已将id参数重写为email。资源:用户,仅:[:show,:index],param::Email回答得好。还有User.find_by(email:params[:email])
我个人喜欢它。它只会给我一个空结果。。。当我输入静态值代替params[:email]时,返回结果。@user3906755这意味着该电子邮件中没有这样的用户。它不是nil,因为我用if条件检查了它,所以如果它为nil,则转到else条件。。。def show if params[:email]resource=User.find_by_email(params[:email])render:json=>resource.as_json else@resource=User.where(email:“priyatosh。ojha@gmail.com第一个呈现:json=>resource.as_jsonend@user3906755我的意思是没有这样的用户与电子邮件之前,你给。好答案。还有User.find_by(email:params[:email])
我个人喜欢它。它只会给我一个空结果。。。当我输入静态值代替params[:email]时,返回结果。@user3906755这意味着该电子邮件中没有这样的用户。它不是nil,因为我用if条件检查了它,所以如果它为nil,则转到else条件。。。def show if params[:email]resource=User.find_by_email(params[:email])render:json=>resource.as_json else@resource=User.where(email:“priyatosh。ojha@gmail.com第一个呈现:json=>resource.as_jsonend@user3906755我的意思是没有这样的用户与电子邮件之前,你给。欢迎堆栈溢出。在创建问题或答案时,使用正确的语法很重要。这意味着要确保你的大写字母和拼写是正确的。我们知道英语可能不是你的主要语言,但拼写和语法检查可以帮助你。是一篇很好的文章。解释得很好。。。但你们能解释一下我是否需要在url中传递数据吗?是的,你们可以