rails 小白问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
final0pro
V2EX    Ruby on Rails

rails 小白问题

  •  
  •   final0pro 2015-12-09 00:25:40 +08:00 4333 次点击
    这是一个创建于 3595 天前的主题,其中的信息可能已经有所发展或是发生改变。

    刚接触 rails4 不久,在写一个 API

    对一个请求,我想验证传进来的
    URL 参数是否合法,要求一个参数 id 必须非空。

    google 了下,最佳实践是在 model 层里添加 validation 。

    有点不解。

    比方说,在 controller 里

    user  User.new(params) # 做些其他 耗时的操作 user.save! 

    id 的 validation 发生在 user.save!,这样就算是 null ,那些耗时的操作仍然会发生。

    validation 不应该是接受请求之后第一件做的事情吗?

    不知道用 Strong Parameters 是否能解决这个问题

    JOSN body 大致这样

    { "request": { "id": "1" } } 

    params.require(:request)这样可以确保:request 存在,但是没找到例子可以确保 id 存在?


    好吧,好像 require 可以用多次

    这样
    params.require(:request).require(:id)

    我错了...

    21 条回复    2015-12-09 17:42:19 +08:00
    chaucerling
        1
    chaucerling  
       2015-12-09 00:52:07 +08:00
    如果有 api 参数验证的场景,试试 grape
    写了差不多一年 rails , 我觉得它不太适合做 api ,而是快速开发表单和内容展示为主的网站
    cuebyte
        2
    cuebyte  
       2015-12-09 01:51:00 +08:00
    require 后面可以加 permit
    cxbig
        3
    cxbig  
       2015-12-09 02:50:38 +08:00
    根据 ror 的定义,任何跟 model 有关的东西都是交由 model 来处理的
    controller 只负责 filter 掉非正常的参数。
    pynix
        4
    pynix  
       2015-12-09 03:11:21 +08:00
    耗时操作必须是同步的=
    pynix
        5
    pynix  
       2015-12-09 03:11:41 +08:00
    吗?
    lightening
        6
    lightening  
       2015-12-09 03:39:45 +08:00
    最好把耗时的操作改成异步……
    不过,你也可以
    ```
    user = User.new(user_params)

    if user.valid?
    do_something
    user.save
    end
    ```
    final0pro
        7
    final0pro  
    OP
       2015-12-09 03:52:49 +08:00
    @chaucerling 哈哈,这个不是我能决定的
    final0pro
        8
    final0pro  
    OP
       2015-12-09 03:53:06 +08:00
    @chaucerling 我也同意你。 rails 挺适合个人开发
    final0pro
        9
    final0pro  
    OP
       2015-12-09 03:53:28 +08:00
    @cuebyte permit 只是允许某些参数可以接受,但不是强制的
    final0pro
        10
    final0pro  
    OP
       2015-12-09 03:54:53 +08:00
    @cxbig 但是 rails4 新增的 strong parameters 特性好像就可以先 validate 一下。 model 的 validation 只能在提交到数据库才会执行,不会发生在`user.new(params)`吧?
    final0pro
        11
    final0pro  
    OP
       2015-12-09 03:56:47 +08:00
    @pynix @lightening 我简略写了。其实是创建 user (user.new)里面,在提交到数据库之前,要跟很多第三方服务交流。

    所以如果 id 是空的话,快速报错会比较合适
    cxbig
        12
    cxbig  
       2015-12-09 05:21:01 +08:00
    @final0pro 通常来说, model 里定义的 validation 是在和数据库交互前就完成的。
    但是跟主键 ID 相关的,比方说 model.new 的候你了一已有的 ID ,那反就是自於。
    lightening
        13
    lightening  
       2015-12-09 05:41:34 +08:00
    @final0pro 你可以预先用 user.valid? 方法验证一下是不是能过 validation 。
    final0pro
        14
    final0pro  
    OP
       2015-12-09 05:51:44 +08:00
    @lightening 比如说 User 还有个 blah field ,这个 blah 非空,但是这个 blah 要通过第三方服务来获得。

    在 User.initialize(params) 中

    def initialize(params)
    user = User.new(params)
    # 无法调用 valid?,因为 blah 此时为 nil ,肯定 return false
    # 而且 third_party 需要 params 里的 :lala ,还需要确保在获取 request parameters 的时候 lala 在里面
    user.blah = third_party.get_blah(params[:lala])
    user
    end

    :(
    lightening
        15
    lightening  
       2015-12-09 08:19:38 +08:00 via iPhone
    那就没什么办法咯 只好用 strong params 处理一下,或者写个方法简单的过一下 params 。

    当然你也可以先 valid?一下然后看 user.errors 里除去 blah 的 attributes 有没有报错。
    crayygy
        16
    crayygy  
       2015-12-09 08:59:37 +08:00
    之前想学 RoR 来着,看了段时间就疲了,没有耐心坚持下去...
    final0pro
        17
    final0pro  
    OP
       2015-12-09 13:13:13 +08:00
    @lightening 哈哈哈。还是开始来的直接!以前写 java 写的习惯了。。。
    final0pro
        18
    final0pro  
    OP
       2015-12-09 13:13:28 +08:00
    @crayygy project 就是源动力
    jimrok
        19
    jimrok  
       2015-12-09 13:16:06 +08:00
    我可以建议你用 grape 来做吗?
    TangMonk
        20
    TangMonk  
       2015-12-09 13:43:43 +08:00
    grape
    crayygy
        21
    crayygy  
       2015-12-09 17:42:19 +08:00
    @final0pro 然而我都是自学,基本上没有什么 ddl 的压力,所以就三分钟热度了,过几天就不想学了,我也是很烦躁...
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     881 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 21:48 PVG 05:48 LAX 14:48 JFK 17:48
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86