1

我使用带有强参数的Rails 4尝试通过名为“provider_id”的参数来查找用户。 希望的是,我就可以让我的API调用一个网址,如:查找ID为非参数的模型

url.com/api/v1/user?provider=facebook?provider_id=12345

我的路线如下:的routes.rb

namespace :api do 
    namespace :v1 do 
     resources :users 
     match '/:provider/:provider_id', to: 'users#find_by_provider', via: 'get' 
    end 
end 

我坚强的参数是:

def user_params 
    params.require(:user).permit(:name, :age, :location, :provider, :provider_id) if params[:user] 
end 

我的功能是:

def find_by_provider 
    @user = User.find(params[:provider_id]) 

    respond_to do |format| 
     format.json { render json: @user } 
    end 
end 

目前,我与测试: url.com/api/v1/facebook/12345 和它返回:

"{"provider"=>"facebook", 
"provider_id"=>"12345"}" 

这是很好的!但我现在得到的错误:“找不到用户id = 12345”

此外,有点相关:偶尔我会收到一个错误,说“param not found:user”。

有什么建议吗?谢谢!

回答

1

变化:

@user = User.find(params[:provider_id]) 

要:

@user = User.find_by(:provider_id => params[:provider_id]) 
+0

这和卢克的回答有什么不同? – eightonrose

+1

@eightonrose这将返回您正在查询的单个Activerecord对象,而Luke的答案返回一个关系对象,这就是为什么他需要调用'take'来从关系中检索第一个项目 – bjhaid

+0

比这更快吗? – Luke

1

这是一个完美的例子,其中使用find_by!(注意!)。

@user = User.find_by!(:provider_id => params[:provider_id]) 

它就像find_by,并返回一个User。但是如果找不到用户,则会引发ActiveRecord::RecordNotFound错误。该异常由Rails自动处理,并转换为404错误页面。