0

ランダムなアイテムジェネレーターがあります。これがring.rbのコードです。

class Ring < ActiveRecord::Base

  belongs_to :user

  after_initialize :randomly_make_ring

  def randomly_make_ring
    #everything is figured during initialization
    #You can call instance.make_ring to do it at any time.

    #chance calculation for description
    random_description = rand(1000)

    case random_description
    when 0..500
      self.description = 'Silver'
    when 501..800
      self.description = 'Gold'
    when 801..1000
      self.description = 'Diamond'
    end

    #Chance Calculation for Quality
    random_quality = rand(1000)

    case random_quality
    when 0..500
      self.quality = 'Sturdy'
    when 501..800
      self.quality = 'Elegant'
    when 801..1000
      self.quality = 'Platinum'
    end

    # Attributes according to the description
    case description
    when 'Silver'
      self.min_guard_roll = 1
      self.max_guard_roll = 2 + rand(4)
      self.min_pet_roll = 0
      self.max_pet_roll = 1
      self.min_trap_roll = 0
      self.max_trap_roll = 2
      self.buy = 20 + rand(15)      
    when 'Gold'
      self.min_guard_roll = 2
      self.max_guard_roll = 3 + rand(7)
      self.min_pet_roll = 1
      self.max_pet_roll = 3
      self.min_trap_roll = 1
      self.max_trap_roll = 3
      self.buy = 30 + rand(25)
    when 'Diamond'
      self.min_guard_roll = 4
      self.max_guard_roll = 5 + rand(10)
      self.min_pet_roll = 2
      self.max_pet_roll = 5
      self.min_trap_roll = 2
      self.max_trap_roll = 6
      self.buy = 80 + rand(48)
    end   

    # Attributes according to the quality
    case quality
    when 'Sturdy'
      self.min_guard_roll = self.min_guard_roll + 1
      self.max_guard_roll = self.max_guard_roll + (1 + rand(2))
      self.buy = self.buy + (10 + rand(6))   
    when 'Elegant'
      self.min_guard_roll = self.min_guard_roll + 2
      self.max_guard_roll = self.max_guard_roll + (2 + rand(3))
      self.buy = self.buy + (25 + rand(14))  
    when 'Platinum'
      self.min_guard_roll = self.min_guard_roll + 4
      self.max_guard_roll = self.max_guard_roll + (4 + rand(8))
      self.buy = self.buy + (45 + rand(25))  
    end

    # Generate display name
    self.display_name = quality + ' ' + description + ' Ring'

    # Generate Sell Value
    self.sell = self.buy * ((10 + rand(20)).to_f / (31 + rand(20)).to_f).to_f



  end

  attr_accessible :user, :active, :display_name, :description, :buy, :sell, :min_guard_roll, :max_guard_roll, :min_trap_roll, :max_trap_roll, :min_pet_roll, :max_pet_roll, :image

終わり

これが私のコントローラーと私が設定したアクションです:

def create

@ring = Ring.new
@ring.user = current_user

@ring.save

@user = current_user
@user.gold = @user.gold - 25 
@user.save

redirect_to ring_path(:id => @ring.id)


end  

def show
    @ring = Ring.find(params[:id])
  end

私が抱えている問題は、リングが作成されるたびに、表示ページのページに移動しますが、リングにはDBに保存されたものとは異なる属性があることです。そのため、正しいリングを取得していません。理由がわからないため、ページが表示または更新されるたびに新しいリングが生成されます。@ringを表示してプロパティを表示するページでも同じことが起こります。

私がこれを機能させたい正確な方法は、ユーザーが指輪を探すことができ、それからランダムな指輪を表示することです。彼らはそれを購入するか、別の指輪を見るかを選択できます。彼らがそれを買うことを選ぶならば、それはそこにあります、彼らが別のものを見ることを選ぶならば、現在のものは破壊されます。

誰かが私にこれが起こっている理由とこれを設定するより良い方法があるかどうかを理解するのを手伝ってもらえますか?ありがとう!

4

1 に答える 1

0

after_initializeコールバックは、オブジェクトがインスタンス化されるたびに実行されます。これRing.newは、オブジェクトをデータベースから取得する場合でも、find. 現状では、データベースからオブジェクトを取得するたびに、ランダムに生成された属性ですべての属性をすぐに上書きします。

コールバックをオブジェクトが最初に保存されたときに実行されるように変更するbefore_createか、コールバックをまったく作成せず、必要な場合にのみ呼び出すことができます。

于 2012-07-08T14:59:23.513 に答える