2016-11-28 2 views
2

У меня есть модель Event. И у него есть budget param. Бизнес-логика требует, чтобы budget, после установки на создание, не может быть изменен позже. На стороне клиента это означает, что я отключить соответствующее поле.Рельсы разные параметры для создания и обновления

Но, конечно, эти данные все равно могут быть отправлены на сервер вручную. на сервере, до установки был следующим:

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

И event_params были использованы как создавать и методы обновления. Я рассматривал возможность создания двух различных наборов разрешенных параметров для создания и обновления, но мне не нравится эта идея, потому что СУХОЙ.

Каковы были бы ваши предложения по этому вопросу? Как предотвратить обновление бюджета при сохранении кода?

ответ

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_create и event_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) 

Таким образом, вы только настраиваете свои общие поля один раз.

Смежные вопросы