2016-10-06 2 views
0

등록 컨트롤러 및 암호 컨트롤러를 사용하여 사용자 모델을 업데이트 할 수 있습니다. 어떤 컨트롤러 업데이트 방법이 모델 내부에서 호출되는지 찾을 수있는 방법이 있습니까?모델 내부에 현재 컨트롤러 이름을 찾는 방법이 있습니까?

모델 안에 컨트롤러 이름을 찾고 싶습니다. 도와주세요.

+2

두 가지를 구분해야하는 이유는 무엇입니까? 두 업데이트의 차이점을 보여주는 코드를 게시 할 수 있습니까? 이것을 처리하는 더 좋은 방법이있을 수 있습니다. – spickermann

+0

전화 (유효 함)에 대한 유효성 검사가 있습니다.이 경우 전화 번호없이 작성된 사용자를 초대하는 옵션이 있습니다. 그러나 사용자가 자신의 비밀번호를 잊어 버리려고하면 "비밀번호를 잊어 버릴 수 없습니다."라는 오류 메시지가 나타납니다. 그래서 나는 암호 컨트롤러에서 요청이 왔을 때에 만 유효성 검사를 건너 뛰고 싶다. –

+0

모델에서 서비스 개체로 유효성 검사를 이동하는 것이 좋은 생각 일 수 있습니다. – spickermann

답변

4

모델 및 컨트롤러 레이어가 분리되어 있습니다. 모델은 컨트롤러 관련 항목을 인식하지 못합니다.

컨트롤러 이름을 모델에서 가져 오는 유일한 방법은 컨트롤러 이름을 모델로 정의 된 일부 메서드에 인수로 전달하는 것입니다.

모델에서 컨트롤러의 이름을 아는 것이 실제로 사용 된 적이 없습니다. 그러한 필요성 IMHO는 당신이 잘못 설계 한 것을 의미합니다.

+0

전화 (유효 함)에 대한 유효성을 검사했습니다.이 경우 전화 번호없이 생성 한 사용자를 초대하는 옵션이 있습니다. 그러나 사용자가 자신의 비밀번호를 잊어 버리려고하면 "비밀번호를 잊어 버릴 수 없습니다."라는 오류 메시지가 나타납니다. 그래서 나는 암호 컨트롤러에서 요청이 왔을 때에 만 유효성 검사를 건너 뛰고 싶다. –

1

초대 된 사용자가 아직 활성화되지 않은 것으로 가정합니다. 따라서 활성 사용자에 대해서만 현재 상태 확인을 정의하는 방법은 무엇입니까? 어쩌면이 같은 추가 : 내가 코드를 테스트하지 않았습니다, 그래서 복사 안전하지

validates_presence_of :phone_number, if :activated? 

를)

0

가능한 해결 방법은 다음과 같습니다

class User < ActiveRecord::Base 
    with_options :if => :phone_required do |user| 
     user.validates_presence_of :phone 
    end 
end 

phone_required 때문에 데이터베이스 열입니다 사용자를위한 이주를 작성해야합니다. 컨트롤러에서

당신은

your_user.phone_required = false 

또는

your_user.phone_required = true 

저장하기 전에 설정해야합니다.

모델은 컨트롤러의 태평해야하지만이 때 당신은 컨트롤러에 전달할 수 있습니다 ..

class SomeModel < ActiveRecord::Base 
    attr :controller 
end 

이제 모델의 가상 속성을 사용하는 경우 달성하기 어렵지 않다 나는 강력하게 이러한 행위를 억제

0

업데이트 : 예 :

class SomeModelsController < ApplicationController 
    def update 
    @some_model.update_attributes(params[:some_model].merge(controller: self)) 
    end 
end 
관련 문제