Rails创建和更新中的不同参数

时间:2016-11-28 17:19:07

标签: ruby-on-rails validation dry strong-parameters

我有一个Event型号。它有budget个参数。业务逻辑要求budget一旦创建,就无法在以后更改。 在客户端,这意味着我禁用了相应的字段。

但是,当然,这些数据仍然可以手动发送到服务器。 在服务器上,先前的设置如下:

def event_params
  params
    .require(:event)
    .permit(
      :title,
      :budget,
      ...
    )

在创建和更新方法中都使用了event_params。 我正在考虑为创建和更新创建两组不同的允许参数,但我不喜欢这个想法因为DRY。

您对此问题的建议是什么?如何在保持代码优雅的同时防止预算更新?

1 个答案:

答案 0 :(得分:2)

如果以后无法更改budget,则您无法在更新操作的参数上允许:budget(例如:@event.update(event_params))。这不违反DRY,它是您网站的安全问题。

例如,检查设计的工作原理。他有sign_up的一组参数和account_update的不同参数 https://github.com/plataformatec/devise/blob/master/app/controllers/devise/registrations_controller.rb#L137

但是,如果要对创建和更新使用相同的参数,则可以将业务逻辑移动到服务。这是一篇关于它们的好文章:https://blog.engineyard.com/2014/keeping-your-rails-controllers-dry-with-services

这个想法是创建一个EventService,其中一个方法可以创建,另一个方法可以更新。每种方法都会处理从控制器收到的允许参数(来自event_params