0

Cookie に関する Rails 4 の問題があり、解決策がなく、一日中頭痛の種になっています。Cookie の値が変化するか、他の変数の値に影響を与えているようです。私は Rails とプログラミング全般に不慣れであり、Cookie を誤用していると思われますが、これが機能することは確かに素晴らしいことです。

アプリにはカードのデッキがあり、小さな山を作り、その山からカードを選択します。カードの選択でエラーが発生します。

すべてのコードは application_controller.rb にあります。card_ids の cookie[:pile] 配列を文字列として保存し、必要に応じて配列化しています。

このコードは機能します:

  def select_card_id
    @pile = cookies[:pile].split(',')
    i = rand(@pile.length - 1)
    @id = @pile[i]
  end

出来上がり。毎回パイルからランダムなカード。

カードをよりランダムな順序で循環させたい場合、アプリは次にどのカードを引くべきかを知る必要があり、そこで Cookie が失敗します。

このコードは、@pile 変数を意味する「undefined method `<' for nil:NilClass」というエラーで失敗します。

  def select_card_id
    @pile = cookies[:pile].split(',')
    i = cookies[:index]

    if i < @pile.length
      @id = @pile[i]
      cookies[:index] += 1
    else
      cookies[:index] = 0
      @id = @pile[0]
    end
  end

cookies[:index] を強制的に整数にすると、プロットが濃くなります。これは、以前に 0 に設定したため、2 度奇妙であり、エラーの原因ではありませんでしたが、アプリは @pile が nil であることについて煮詰めています。

このコードは、「id=3 のカードが見つかりませんでした」というエラーで失敗します。

 def select_card_id
    @pile = cookies[:pile].split(',')
    i = cookies[:index].to_i

    if i < @pile.length
      @id = @pile[i]
      cookies[:index] = i + 1
    else
      cookies[:index] = 0
      @id = @pile[0]
    end
  end

それが参照しているコードは、「テスト」コントローラーの「新規」アクションで次のとおりです。

@id = select_card_id
@card = Card.find(@id) 

それについて奇妙なのは、card_id が 3 ではなく、1 桁でさえないだけでなく、多くの試行錯誤の後、Cookie が変数の最初の桁を切り捨てていることに気付きました。このインスタンスで選択された @id は 3 ではなく、33 でした。@id が 40 の場合、0 を探します。

どんな助けでも大歓迎です、ありがとう。

4

1 に答える 1

1

クッキーは文字列を保存します。あらゆる種類の型変換は、アプリケーション コードで行う必要があります。

于 2013-11-24T02:43:37.877 に答える