【问题标题】:Validate paramaters in Restful endpoints验证 Restful 端点中的参数
【发布时间】:2015-07-01 18:57:04
【问题描述】:

我是 Rails RESTful Web 服务的新手,我正在尝试构建返回交易的 json 转储的服务。到目前为止,当您点击 http://localhost:3000/api/deals 时,我的应用程序会以 json 格式返回这些交易。现在我想在uri http://localhost:3000/api/deals?deal_id=2&title=book 中添加两个强制参数(deal_id 和title)和两个可选参数。验证这两个强制参数的最佳方法是什么?换句话说,我只想在 deal_id 和 title 参数存在的情况下进行查询。假设 Deal 模型包含字段 deal_id、title、description 和 vendor。
这是我的代码

控制器

  module Api
  class DealsController < ApplicationController
  respond_to :json

  def index
   @deals = Deal.all
   respond_with (@deals)
  end
 end
end

路线

 namespace :api,:defaults => {format:'json'} do
 resources :deals
end

【问题讨论】:

  • 接受的答案here 有一些选项很好。您还可以在路由定义中使用contraints 在控制器之前进行验证。希望这会有所帮助。
  • @steve klein 谢谢但在我的情况下,我需要帮助来验证我目前所拥有的这两个强制性参数。
  • 如果您的主要问题是关于如何验证,也许您可​​以根据您的验证要求更新您的帖子。

标签: ruby-on-rails ruby-on-rails-3 web-services rest ruby-on-rails-4


【解决方案1】:

要验证 Rails 路由中是否存在查询参数,您可以使用 :constraints 选项。所以,在你的情况下,如果你想要求参数 deal_idtitle 的存在,你可以通过改变来做到这一点:

resources :deals

收件人:

resources :deals, :constraints => lambda{ |req| !req.params[:deal_id].blank? && !req.params[:title].blank? }

然后,在您的控制器中,您可以访问 params 哈希中的所有四个参数。

或者,如果您想提供更多用户友好的错误消息,您可以在控制器中进行验证。有多种方法。我可能会这样做:

def action
  if params[:deal_id].blank? || params[:title].blank?
    flash[:warning] = 'Deal ID and title must be present'
    redirect_to root_path and return
  end

  #rest of your code goes here
end

【讨论】:

  • 谢谢。你怎么通知客户呢?你可以在控制器中做@deal.errors 吗?
  • @Katie - 我刚刚用替代解决方案更新了我的答案。
  • 谢谢。但请记住,错误以 json 格式返回,因为这是一项 Web 服务。
  • 哎呀好点@Katie。我假设我的回答会让你走上正轨,但如果你需要帮助来格式化 json 中的错误,请告诉我。
猜你喜欢
  • 2014-12-25
  • 2019-08-28
  • 1970-01-01
  • 1970-01-01
  • 2020-03-23
  • 2021-10-17
  • 2015-07-09
  • 2018-05-16
  • 1970-01-01
相关资源
最近更新 更多