无法在Rails中将URL作为参数发送到URL中

时间:2016-02-12 12:45:32

标签: ruby-on-rails ruby api ruby-on-rails-4

我正在编写一个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

4 个答案:

答案 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