Ruby on rails 无法将电子邮件作为Rails中URL中的参数发送

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(.:

我正在编写一个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(.: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中传递数据吗?是的,你们可以