1

내 응용 프로그램에는 사용자 개체 모델이 있습니다. 페이스 북에 접속하기 위해 코알라와 OmniAuth를 사용하고 있습니다.데이터베이스에 저장된 일부 속성과 Facebook에서 읽은 일부 속성을 사용하여 ActiveRecord 모델을 만드는 방법

페이스 북에서 내 모델에 컨트롤러의 데이터를 올바르게 직렬화하는 방법으로 데이터를 추가하는 방법을 알아 내려고합니다.

는 이미 그런 내 컨트롤러에 페이스 북의 데이터를 얻을 수 있었다 :

token = request.env["omniauth.auth"]["credentials"]["token"] 
api = Koala::Facebook::API.new(token) 
api.get_object("me") 

그리고 내가하지만 방법으로, DB 컬럼없이 내 모델에 속성을 추가하는 방법까지 생각 생각 일련 번호가 지정된 응답에 그대로 유지됩니다.

def fb_info 
    {"fb_info" =>"should be here"} 
end 

def attributes 
    super.merge('fb_info' => fb_info) 
end 

그렇다면 함께 사용하는 것이 가장 좋은 방법은 무엇입니까? 내 모델에서 어떻게 든 속성을 채워야합니다. 그걸하기 위해서 거기에 액세스 토큰이 필요합니다. 컨트롤러를 호출하여 모델을 호출하거나 모델에 토큰을 전달하는 것은 지저분 해 보입니다. 이 문제를 해결할 수있는 확실한 방법이 있습니까?

답변

2

모델에 setter 메서드를 추가하고이 메서드 내에서 모든 데이터 변환을 수행하십시오. 대부분의 경우, '실제'속성으로 수행 할 수있는 것과 똑같은 방식으로 컨트롤러에서 setter 메소드에 데이터를 전달할 수 있습니다. 그러나이 데이터를 데이터베이스에 저장하려면 직접 처리해야합니다.

def virtual_column_name=(raw_data) 
    # some code to handle raw_data and put it into database 
end 
+0

단순하고 단순합니다. 이 접근법에서 내가 가진 유일한 문제는 모델에서 데이터를 채우는 컨트롤러 (컨트롤러가 데이터를 읽어야하는 흐름에서도)를 배치한다는 점입니다. 이것이 최선의 실행인지 확실하지 않습니다. 또한 객체 목록을 렌더링 할 때 (예를 들어) 컨트롤러의 모든 모델 객체를 반복해야하므로 컨트롤러의 모델 관련 코드가 너무 많아 보입니다. – davidrac

+0

예, 컨트롤러는 가능한 단순해야합니다. 컨트롤러 코드가 너무 복잡한 경우이 코드의 일부를 모델링하거나 심지어 라이브러리를 분리 할 수도 있습니다. 때때로'rails_best_practices' 젬이 힌트를 줄 수 있습니다. –