新手问题 Grape 健壮参数问题处理

pinewong · 2016年06月11日 · 最后由 pinewong 回复于 2016年06月11日 · 2455 次阅读

我在 Rails 中集成 Grape,进行 Create 操作时,Rails 有个健壮参数控制,我尝试用下面两种方式解决:

第一种,Rails 原生方案

User.create(params.required(:root).permit(:name, :email))

但问题是 required 参数不知道用什么,因为 API 请求跟普通站点不同,不会把参数都封装到一个哈希里面,而是全部直接放到根节点。我试过不加 required 方法:

params.permit(:name, :email)

但是没有像预期返回包含:name, :email的哈希,而是返回 NULL。 好吧,其实第一种就是自己对 params 对象的 required 和 permit 方法原理不熟导致!不知道怎么解决单层哈希的健壮参数处理

第二种,Gem 去除健壮参数控制,然后采用 Grape 的 declared 控制参数

这个能解决,Grape 文档上也有说明

User.create(declared(params))

但有个问题,这样我的项目里其他 Controller 中,都不能用健壮参数了,对混合程序有点麻烦. 所以来社区发个帖子,问下你们是怎么解决这个问题的?

贴下完整的代码

#1 楼 @pathbox

desc '创建账户信息' do
    failure [
        [498, '账户号已存在'],
        [499, '操作失败'],
    ]
end
params do
        requires :number, type: String, desc: '账户号', message: :requires
        requires :unit, type: String, desc: '收费单位', message: :requires
        requires :name, type: String, desc: '户主姓名', message: :requires
        optional :address, type: String, desc: '户主地址'
        optional :balance, type: String, desc: '账户余额'
        optional :deleted, type: Boolean, desc: '账户未激活?'
end
post '/' do
    if Fuel.exists?(number: params[:number])
        error!('账户号已存在', 498)
    end
    if params[:balance] && params[:balance].to_f <= 0
        error!('账户余额不合法', 400)
    end
    # @fuel = Fuel.new(params.permit(:number, :unit, :name, :address, :balance, :deleted))
    @fuel = Fuel.new(declared(params, include_missing: false))
    # 执行操作,失败直接返回
    error_by!(@fuel.save)
    # 正确返回
    return_success
end

意图就是 create 的 api,然后主要问题在代码:

# @fuel = Fuel.new(params.permit(:number, :unit, :name, :address, :balance, :deleted))
@fuel = Fuel.new(declared(params, include_missing: false))

现在我是用第二句解决健壮参数问题(加上了gem 'hashie-forbidden_attributes'以取消 Rails 的默认健壮参数), 我现在想问的是有没有办法以注释掉的那一句(原生 Rails 方法)的办法解决,因为我不想用gem 'hashie-forbidden_attributes'这个 gem,我现在的 pramas 为:

{
  "number": "8000113111",
  "unit": "中国电力局",
  "name": "李某"
}

但有个问题,这样我的项目里其他 Controller 中,都不能用健壮参数了,对混合程序有点麻烦

使用 declared 会导致其他 rails 的 controller 不能用健壮参数?

#3 楼 @pathbox 不是 declared 导致的,是使用hashie-forbidden_attributes这个 gem,会让项目所有地方不用健壮参数也不会报错了。 不过你的话提醒了一下我,健壮参数只是一个习惯,我们有了这个习惯,每次 Create 和 Update 自然而然的会给 params 加上 required 和 permit 方法了,报不报错又何妨。 综上,我可能思想上进了一个死胡同,谢谢你 😄 ,这个问题用这个 gem 解决就可以了

5 楼 已删除
需要 登录 后方可回复, 如果你还没有账号请 注册新账号