2016-11-28 1 views
2

Event 모델이 있습니다. 그리고 그것은 budget param을 가지고 있습니다. 비즈니스 로직을 사용하면 budget이 생성시 설정되면 나중에 변경할 수 없습니다. 클라이언트 쪽에서 이것은 해당 필드를 비활성화한다는 것을 의미합니다.레일을 생성하고 업데이트 할 때 다른 매개 변수를 바꿉니다.

물론이 데이터는 수동으로 서버로 보낼 수 있습니다.

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

그리고 event_params

생성 및 업데이트 방법을 모두 사용되었다 : 서버에 사전 설치는 다음이었다. 작성 및 업데이트를 위해 허용되는 매개 변수의 두 가지 별개 집합을 만드는 것을 고려하고 있었지만 DRY 때문에이 아이디어가 마음에 들지 않습니다.

이 질문에 대한 귀하의 제안은 무엇입니까? 코드를 우아하게 유지하면서 예산을 업데이트하지 못하게하는 방법은 무엇입니까?

답변

1

budget을 나중에 변경할 수없는 경우 업데이트 동작 매개 변수 (예 :)에 :budget을 허용 할 수 없습니다. 이는 DRY를 위반하지 않으며 사이트의 보안 문제입니다.

예를 들어, devise가 작동하는 방식을 확인하십시오. 그는 한 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

아이디어는 창조하고 다른 사람을 새롭게하는 1 개의 방법과 더불어 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) 

이렇게하면 일반 필드를 한 번만 구성 할 수 있습니다.

관련 문제