2016-11-28 44 views
2

我有一个Event模型。它有budget参数。业务逻辑要求在创建时设置budget以后不能更改。 在客户端,这意味着我禁用相应的字段。Rails不同的参数在创建和更新

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

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

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

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

回答

1

如果以后不能更改budget,则不能允许更新操作的参数(例如:)上的:budget。这不违反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

0

正如您所建议的,您可以使用两个单独的助手event_params_for_createevent_params_for_update

以干燥起来,你可以试试这个:

def event_params_common 
    [:generic_value_1, :generic_value_2] 
end 

def event_params_for_create 
    event_params_preprocessed 
    .require(:event) 
    .permit(event_params_common.concat([:extra_create_only_param])) 
end 

def event_params_for_update 
    event_params_preprocessed 
    .require(:event) 
    .permit(event_params_common) 
end 

你会再使用创建或更新,例如在相应的方法;

# def create 
@event = Event.new(event_params_for_create) 

# def update 
@event.update(event_params_for_update) 

通过这种方式,您只需配置一次通用字段即可。

相关问题