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

pinewong · 发布于 2016年06月11日 · 最后由 pinewong 回复于 2016年06月11日 · 812 次阅读
24405

我在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中,都不能用健壮参数了,对混合程序有点麻烦. 所以来社区发个帖子,问下你们是怎么解决这个问题的?

共收到 4 条回复
15420

贴下完整的代码

24405

#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": "李某"
}
15420

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

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

24405

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

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