我有一个Event
型号。它有budget
个参数。业务逻辑要求budget
一旦创建,就无法在以后更改。
在客户端,这意味着我禁用了相应的字段。
但是,当然,这些数据仍然可以手动发送到服务器。 在服务器上,先前的设置如下:
def event_params
params
.require(:event)
.permit(
:title,
:budget,
...
)
在创建和更新方法中都使用了event_params
。
我正在考虑为创建和更新创建两组不同的允许参数,但我不喜欢这个想法因为DRY。
您对此问题的建议是什么?如何在保持代码优雅的同时防止预算更新?
答案 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
)