컨트롤러 및 모델에서 중복 위생을 방지하는 방법은 무엇입니까?

귀종

Params를 반환하는 Rails 메서드가 있습니다.

def customer_params
  params.require(:treatment_booking).require(:customer)
end

:phone제자리 에서 공백을 제거 하고 전체 해시를 반환하고 싶습니다 . 그렇게 할 수 있습니다.

params.require(:treatment_booking).require(:customer).merge(:phone => params[:treatment_booking][:customer][:phone].gsub(/\s+/, ""))

..하지만 이미 메서드를 호출 한 해시에 대한 전체 경로를 참조해야하기 때문에 다소 우아하지 않다고 생각합니다. 더 좋은 방법이 있습니까?

답은 Ruby와 Rails가 될 수 있습니다.

일반적으로 내가하는 일은 예약 컨트롤러에서 고객을 업데이트하는 것입니다. 고객은 지속될 수 있지만 비밀번호가 없어서 데이터를 변경할 수 없습니다. 추가 만하면됩니다.

컨트롤러의 내용은 다음과 같습니다.

  def create
    customer = Customer.find_or_create_by(email: customer_params[:email])
    if not customer.persisted?
      customer.phone = customer_params[:phone] if not customer_params[:phone].empty?
      customer.name = customer_params[:name] if not customer_params[:name].empty?
      save_customer(customer)
    elsif (customer.phone != customer_params[:phone] || customer.name.downcase != customer_params[:name].downcase)
      customer.phone = customer_params[:phone] if customer.phone.empty?
      customer.name = customer_params[:name] if customer.name.empty?
      save_customer(customer)
      redirect_to :back, notice: "This email address has been used before, you can register it or use the same Name and Phone"
      return
    else
      set_session_customer(customer.id)
    end

  < .. .. >
  end
Spickermann

매개 변수를 삭제하는 것은 컨트롤러의 책임이 아니라고 생각합니다. 그러나 속성이 유효한지 확인하는 것은 모델의 책임입니다.

모델 속성을 삭제하려면 Customer다음과 같이 모델에 사용자 지정 setter를 추가합니다 .

# in app/models/customer.rb
def phone=(phone)
  write_attribute(:phone, phone.gsub(/\s+/, ''))
end

그리고 customer_params컨트롤러를 변경하지 마십시오 .


귀하의 의견을 해결하려면 : 컨트롤러에서 많은 일이 진행되고 있습니다. 그리고 IMO 컨트롤러는 이해하고 리팩토링하기가 어렵습니다. 특히 변경된 속성에 대해 얼마나 엄격한 방법 save_customerset_session_customer작업을 수행 해야하는지 모르기 때문 입니다.

업데이트 코드를 Customer모델 로 옮기는 것이 합리적이라고 생각합니다 . 따라서 테스트하기가 더 쉽습니다. 그리고 Rails의 Dirty Attributes를 사용했습니다 .

# in the controller
def create
  existing_customer = Customer.find_by(present_customer_params.fetch(:email))

  if existing_customer
    if existing_customer.contact_detail_update(present_customer_params)
      save_customer(existing_customer)
      redirect_to(
        :back,  notice: 'This email address has been used before, you can register it or use the same Name and Phone'
      ) and return
    else
      set_session_customer(existing_customer.id)
    end
  else
    new_customer = Customer.create(present_customer_params)
    save_customer(new_customer)
  end

  # ...
end

private
  def present_customer_params
    # excludes blank values from the customer_params
    customer_params.select { |_, v| v.present? }
  end

# in the `Contact` model
def contact_detail_update(attrs = {})
  contact_attributes = [:phone, :name]

  # update the customers attributes and let existing customer setters to their job
  attributes = attrs.slice(*contact_attributes) 

  # check case-insensitively if there were any non-trivial changes 
  changes.slice(*contact_attributes).values.any? do |change| 
    change.first.casecmp(change.last) != 0
  end
end

이것이 귀하의 의견에 대한 답변인지 확실하지 않지만 아이디어가 향후 리팩토링에 도움이 될 것입니다 ...

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Cordapp에서 서비스 및 컨트롤러 (kotlin)를 단위 테스트하는 방법은 무엇입니까?

분류에서Dev

상속을 사용하여 모델을 바인딩하기 위해 뷰 및 컨트롤러 메서드를 설정하는 방법은 무엇입니까?

분류에서Dev

AngularJS : 컨트롤러에서 지시문 입력 필드 모델 값을 얻는 방법은 무엇입니까?

분류에서Dev

MVC보기에서 각도 컨트롤러로 모델을 전달하는 방법은 무엇입니까?

분류에서Dev

하나의 웹 API 컨트롤러에서 두 모델을 얻는 방법은 무엇입니까?

분류에서Dev

보기의 목록에서 컨트롤러 및 작업을 표시하는 방법은 무엇입니까?

분류에서Dev

내부 컨트롤러 작업에서 부모 경로 모델을 얻는 방법은 무엇입니까?

분류에서Dev

Laravel 5.2에서 컨트롤러의 기능에서 모델을 얻는 방법은 무엇입니까?

분류에서Dev

지시문에서 자식 및 부모 컨트롤러에 액세스하는 방법은 무엇입니까?

분류에서Dev

Postman을 사용하여 API 컨트롤러에 모델 및 파일을 게시하는 방법은 무엇입니까?

분류에서Dev

AuthorizationHandler 내에서 컨트롤러 및 작업을 얻는 방법은 무엇입니까?

분류에서Dev

laravel 4.1의 컨트롤러에서 모듈의 모델 및 컨트롤러 파일을 호출하는 방법

분류에서Dev

모델과 파일을 컨트롤러에 동시에 전달하는 방법은 무엇입니까?

분류에서Dev

NestJS CLI에서 컨트롤러를 추가 할 모듈을 지정하는 방법은 무엇입니까?

분류에서Dev

Spring MVC 컨트롤러에서 다중 배열로 json을 읽는 방법은 무엇입니까?

분류에서Dev

Umbraco 7.5.8의 컨트롤러에 커스텀 모델을 게시하는 방법은 무엇입니까?

분류에서Dev

모델을 사용하지 않고보기에서 컨트롤러에 제출 한 후 양식 값을 검색하는 방법은 무엇입니까?

분류에서Dev

MYSQL 5.0.27에서 중복 행 삽입을 방지하기 위해 트리거를 생성하는 방법은 무엇입니까?

분류에서Dev

즉시 유효성 검사를 실행하지 않고 컨트롤러에서 모델 속성을 바인딩하는 방법은 무엇입니까?

분류에서Dev

cakephp에서 모델 및 컨트롤러에 대한 유효성 검사를 할당하는 방법은 무엇입니까?

분류에서Dev

모든 테스트에 대해 중복 TestFixtures 배열을 방지하는 방법은 무엇입니까?

분류에서Dev

'지시문'에서 '컨트롤러'의 값을 업데이트하는 방법은 무엇입니까?

분류에서Dev

'지시문'에서 '컨트롤러'의 값을 업데이트하는 방법은 무엇입니까?

분류에서Dev

모델에서 또는 Service Manager (Zend 프레임 워크 2)를 사용하여 요청 컨트롤러, 작업 및 모듈 이름을 검색하는 방법은 무엇입니까?

분류에서Dev

Python에서 중복 트윗을 제거하는 방법은 무엇입니까?

분류에서Dev

Tkinter의 텍스트 위젯에서 복사, 붙여 넣기 및 백 스페이스를 중지하는 방법은 무엇입니까?

분류에서Dev

Autofac 및 ASP.NET Core를 사용하여 컨트롤러에서 속성 주입을 활성화하는 방법은 무엇입니까?

분류에서Dev

Java 텍스트 파일에서 중복 출력을 방지하는 방법은 무엇입니까?

분류에서Dev

Ember : 모델 배열을 정렬하는 비 컨트롤러 방법은 무엇입니까

Related 관련 기사

  1. 1

    Cordapp에서 서비스 및 컨트롤러 (kotlin)를 단위 테스트하는 방법은 무엇입니까?

  2. 2

    상속을 사용하여 모델을 바인딩하기 위해 뷰 및 컨트롤러 메서드를 설정하는 방법은 무엇입니까?

  3. 3

    AngularJS : 컨트롤러에서 지시문 입력 필드 모델 값을 얻는 방법은 무엇입니까?

  4. 4

    MVC보기에서 각도 컨트롤러로 모델을 전달하는 방법은 무엇입니까?

  5. 5

    하나의 웹 API 컨트롤러에서 두 모델을 얻는 방법은 무엇입니까?

  6. 6

    보기의 목록에서 컨트롤러 및 작업을 표시하는 방법은 무엇입니까?

  7. 7

    내부 컨트롤러 작업에서 부모 경로 모델을 얻는 방법은 무엇입니까?

  8. 8

    Laravel 5.2에서 컨트롤러의 기능에서 모델을 얻는 방법은 무엇입니까?

  9. 9

    지시문에서 자식 및 부모 컨트롤러에 액세스하는 방법은 무엇입니까?

  10. 10

    Postman을 사용하여 API 컨트롤러에 모델 및 파일을 게시하는 방법은 무엇입니까?

  11. 11

    AuthorizationHandler 내에서 컨트롤러 및 작업을 얻는 방법은 무엇입니까?

  12. 12

    laravel 4.1의 컨트롤러에서 모듈의 모델 및 컨트롤러 파일을 호출하는 방법

  13. 13

    모델과 파일을 컨트롤러에 동시에 전달하는 방법은 무엇입니까?

  14. 14

    NestJS CLI에서 컨트롤러를 추가 할 모듈을 지정하는 방법은 무엇입니까?

  15. 15

    Spring MVC 컨트롤러에서 다중 배열로 json을 읽는 방법은 무엇입니까?

  16. 16

    Umbraco 7.5.8의 컨트롤러에 커스텀 모델을 게시하는 방법은 무엇입니까?

  17. 17

    모델을 사용하지 않고보기에서 컨트롤러에 제출 한 후 양식 값을 검색하는 방법은 무엇입니까?

  18. 18

    MYSQL 5.0.27에서 중복 행 삽입을 방지하기 위해 트리거를 생성하는 방법은 무엇입니까?

  19. 19

    즉시 유효성 검사를 실행하지 않고 컨트롤러에서 모델 속성을 바인딩하는 방법은 무엇입니까?

  20. 20

    cakephp에서 모델 및 컨트롤러에 대한 유효성 검사를 할당하는 방법은 무엇입니까?

  21. 21

    모든 테스트에 대해 중복 TestFixtures 배열을 방지하는 방법은 무엇입니까?

  22. 22

    '지시문'에서 '컨트롤러'의 값을 업데이트하는 방법은 무엇입니까?

  23. 23

    '지시문'에서 '컨트롤러'의 값을 업데이트하는 방법은 무엇입니까?

  24. 24

    모델에서 또는 Service Manager (Zend 프레임 워크 2)를 사용하여 요청 컨트롤러, 작업 및 모듈 이름을 검색하는 방법은 무엇입니까?

  25. 25

    Python에서 중복 트윗을 제거하는 방법은 무엇입니까?

  26. 26

    Tkinter의 텍스트 위젯에서 복사, 붙여 넣기 및 백 스페이스를 중지하는 방법은 무엇입니까?

  27. 27

    Autofac 및 ASP.NET Core를 사용하여 컨트롤러에서 속성 주입을 활성화하는 방법은 무엇입니까?

  28. 28

    Java 텍스트 파일에서 중복 출력을 방지하는 방법은 무엇입니까?

  29. 29

    Ember : 모델 배열을 정렬하는 비 컨트롤러 방법은 무엇입니까

뜨겁다태그

보관