2011-06-14 11 views
1

私はpaperchase/treasure huntモバイルウェブアプリに取り組んでいます。私は基本認証を持っています。ユーザーが次のコードのいずれかをスキャンすると、sign_upページに誘導されます。これまでのところすべて正常に動作しますが、ここでは難しい部分があります:Rails 3 before_filterブール値の設定と検査|ペーパーチェーン/宝探しゲーム

私は10個のQRコードを持っています。

  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にリダイレクトされます。

これは私のUserモデルの一部です:

... 
    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-コードを設定(私はロジックでbefore_filterのいくつかの種類を記述する必要があることを考えますtrueに設定されています)しかし、私はどのように見えるべきかわからない。事前

答えて

0

モデルに1つのintフィールドを格納するだけではどうですか?私のユーザモデルが

t.integer :qr_code 

を持っている場合たとえば

は、単にあなたのコントローラのアクション内でチェックすることができ:あなたの詳細な回答のため

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を入力している場合は、すでにQR1からQR3を入力していることに本当に気を付けるのですか、または最後に入力した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モデルとその関連付けをリンクします。

また、この構造では、複数の「紙チェイス」を同時に実行できるように、2つの簡単な変更が必要です。あなたのユーザーモデルからuser_paper_chasesモデルにいくつかの項目を移動し、にpaper_chaseパラメータを追加するだけです。

あなたのユーザーインターフェイスは、データモデルのプロパティ用の単純なエディタであり、その2つをしっかりとバインドしなければならないという規則はありません(間違いはありますが間違いがあります)。

+0

Thxをします。今のところ私は@ Msencenbのアイデアを全て実行しています。あなたのアプローチを掘り下げて自分のコードをできるだけ早く改善しようとします。 –

関連する問題