新手问题 Rails 中如何修改用户提交的数据?

blacktulip · 2013年08月05日 · 最后由 outman 回复于 2013年08月05日 · 2455 次阅读

某个支付接口 API 要求提交的数值是以「分」为单位的,比方说要支付 10 块钱,提交的数值得是 1000 。

但是我显然不能在网页上叫用户输入 1000 吧......

现在我在 controller 里面用这样的方式:

  def process_payment
    @card_transaction_details = CardTransactionDetails.new(card_transaction_details_params)
    @card_transaction_details.amount = (@card_transaction_details.amount.to_i * 100).to_s
...
  # 如果表单没填对
  flash.now[:error] = MESSAGE_INVALID_DETAILS
  render '填表页'
end

这样支付成功的话没有问题,但是如果表单有问题的话,重新 render 填表页的时候,付款数值那个 field 就会出问题。

比方说还是要支付 10 块钱,数值 field 填 10 ,然后填表的时候忘了填地址,重新 render 这一页的时候,那个 field 里面就会自动填上 1000 ,这很危险。

请问正确的 practice 应该是什么啊,thx。

记得 财付通就是这么要求的。 很简单啊,你不要去修改 model 对象啊,你在提交 API 的时候,再去修改数据也可以吧。

虚拟属性

不过要走 model 应该也行… 就是要多两步

#1 楼 @outman 噢,这样,thx,我待会研究下可行性……

#3 楼 @blacktulip 不经过 model 也可以虚拟属性啊

噢,我想明白了,是可以用虚拟属性做。不好意思脑子短路

#1 楼 @outman 还是偷懒按你说的方法搞定了,就在发往 API 之前直接乘 100 了。因为发往 API 这段不是我写的,所以之前没仔细研究。谢谢。

#9 楼 @blacktulip 其实这个不应该说是偷懒哦。这个应该是多态的一种吧。你不能修改你原有模型对象,因为那个就像你的基类,然后你在发送这个特别 API 的方法里面乘以 100,解决了问题,你应对了变化。如果以后其他业务要乘以 10,或者乘以 1000 ,你再重写一个新方法,再发送那个 API 的方法里面,乘以对应的数字就 OK 了。

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