2011-06-14 3 views
1

나는 paperchase/treasure hunt 모바일 웹 앱을 연구 중이다. 사용자가 다음 코드 중 하나를 스캔하면 sign_up 페이지로 이동하게됩니다. 지금까지 모든 것이 잘 작동하지만 여기 까다로운 부분이 있습니다 :레일 3 before_filter 설정 및 부울 값 확인 | paperchase/treasure hunt game

나는 10 개의 QR 코드가 하나 하나의 URL을 나타냅니다.

  1. QR 코드 ID : 1 URL : HTTP : //paperchase.heroku.com/qrs/4975
  2. QR 코드 ID : 2 URL : HTTP : //paperchase.heroku.com/qrs/ 2368
  3. QR 코드 ID : 3 URL : HTTP : //paperchase.heroku.com/qrs/2317
  4. QR 코드 ID : 4 URL : HTTP : //paperchase.heroku.com/qrs/2369
  5. QR 코드 ID : 5 URL : HTTP : //paperchase.heroku.com/qrs/6247
  6. QR 코드 ID : 6 URL : HTTP : //paperchase.heroku.com/qrs/1493
  7. QR 코드 ID : 7 URL : HTTP : //paperchase.heroku.com/qrs/1759
  8. QR 코드 ID : 8 URL : HTTP : //paperchase.heroku.com/qrs/4278
  9. QR -code ID : 9 URL : HTTP : //paperchase.heroku.com/qrs/8912
  10. QR 코드 ID : 10 URL : HTTP : //paperchase.heroku.com/qrs/5346

이제 사용자가 표시된 모든 코드를 스캔하도록하십시오. 그는 코드 1을 스캔하면 코드 2에 대한 지침을, 코드 2를 스캔하면 코드 3에 대한 지침을 찾을 것입니다. 하지만 지금은 코드를 건너 뛸 수 있습니다 (예 : 당신은 코드 1 후에 코드 10을 스캔하여 이길 수 있습니다.

내가 생각 해낸 해결책 :

모든 QR-코드가 false로 설정됩니다. QR 코드 1을 검사하면 true로 설정되고 QR 코드 2를 검사 할 수 있습니다. 이제 QR 코드 5를 검사하려면 QR 코드 4가 false로 설정되어 있으므로 root_path로 리디렉션됩니다.

이 내 사용자 모델의 일부입니다

지금은 내가 논리와 before_filter의 어떤 종류를 작성해야한다고 생각
... 
    t.boolean :qr_01, :default => false 
    t.boolean :qr_02, :default => false 
    t.boolean :qr_03, :default => false 
    t.boolean :qr_04, :default => false 
    ... 

(모든 이전 QR-코드 경우 확인 true로 QR-코드를 설정 사실로 설정됩니다.) 그러나 어떻게 보일 것인가에 대한 단서가 없습니다. 사전

답변

0

왜 모델에 하나의 int 필드를 저장하지 않는 것이 좋을까요?

def add_qr 
    user = User.find_by_id(params[:id]) 
    if user.qr_code != params[:qr_code]-1 
    redirect_to(some_url) 
    else 
    user.qr_code+=1 
    user.save 
    #do whatever else you need to do and display view 
    end 
end 
+0

thx, 멋지고 간단한 솔루션입니다! –

0

에서

덕분에 나는 당신이 잘못된 장소에서 검증을 넣어 위해 노력하고 있으며 사용자의 스키마가 조정의 비트를 사용할 수 있습니다 생각합니다.

누군가가 QR4를 입력하는 경우 QR3을 통해 이미 QR1을 입력했는지 정말로 신경 써야합니까? 아니면 실제로 마지막으로 입력 한 QR3 만 신경 썼습니까? 새로운 코드가 입력되는 순간, 실제로 중요한 것은 마지막 코드 바로 다음에 오는 것입니다. 일을 일관성있게 만들기 위해 가상 QR0을 사용하여 "아직 입력하지 않은"상태를 나타낼 수 있습니다.

def add_code(qr) 
    # Check that qr immediately follows self.last_qr; 
    # if it does, then update and save things and 
    # continue on; if it doesn't, then raise an 
    # exception that says, more or less, "QR Code out 
    # of sequence". 
end 

당신은 사용자 모델의 마지막과 현재의 코드를 추적하고 그들이 괜찮아 있는지 확인하기 위해 검증 후크를 사용할 수 있습니다 : 사용자 모델에서

, 당신은이 같은 방법이있을 것이다 : 그것의 기타 작업을 수행하는 동안

before_create :initialize_qrs 
validate :contiguous_qrs 

#... 

def initialize_qrs 
    self.last_qr = 0 
    self.latest_qr = 0 
end 

def contiguous_qrs 
    if(self.last_qr == 0 && self.latest_qr == 0) 
    # New user, no worries. 
    true 
    elsif(self.latest_qr != self.last_qr + 1) 
    # Sequence error, your `add_code` method should 
    # prevent this from ever happening but, hey, bugs 
    # happen and your code shouldn't trust itself any 
    # more than it has to. 
    false 
    end 
    true 
end 

는 귀하의 add_code 방법은 self.last_qrself.latest_qr을 설정하는 것입니다.

그런 다음, 이상 컨트롤러에서 :

def enter_code 
    # Get the code and validate it, leave it in qr 
    begin 
     current_user.add_code(qr) 
    rescue Exception => e 
     # Complain and wag your finger at them for cheating 
    end 
    # Give them instructions for finding the next one, 
    # these instructions would, presumably, come from 
    # something like "instructions = qr.next_one.instructions". 
end 

가 추적 (사용자, QR 코드) 쌍은 감사 목적을 위해 의미가 있지만, 협회로 (별도의 모델이 나에게 더 나을 테이블) :

create table "user_qr_codes" do |t| 
    t.datetime "created_at", :null => false 
    t.datetime "updated_at", :null => false 
    t.integer "user_id", :null => false 
    t.integer "qr_code_id", :null => false 
end 

그런 다음 해당 연결을 일반적인 방식으로 사용자 및 QrCode 모델과 연결하십시오.

또한이 구조는 여러 개의 "종이 체이서"가 동시에 실행될 수 있도록 몇 가지 간단한 수정 만 필요합니다. 사용자 모델에서 두 모델을 user_paper_chases 모델로 이동하고 에 paper_chase 매개 변수를 추가하면됩니다.

사용자 인터페이스는 데이터 모델 속성에 대한 간단한 편집기 여야하며 두 가지를 긴밀히 바인딩해야한다는 규칙은 없습니다. 이는 흔히 실수 (흔히 볼 수있는 실수이지만 실수입니다)입니다.

+0

들으을 상세한 대답 : 예를 들어

내 사용자 모델은 단순히 컨트롤러 액션 내에서 확인할 수 있습니다

t.integer :qr_code 

이 있다면. 당장은 @ Msencenb의 아이디어를 가지고 모든 것을 다뤄야합니다. 나는 당신의 접근 방식을 최대한 빨리 개선하려고 노력할 것이다. –