0

これを実行するとなぜ空になるのですか?ユーザーのポイントは2500と仮定します。83を返す必要があります

post_controller

@user = User.find(params[:id])
@user.percentage = count_percentage(@user)
@user.save

application_controller

def count_percentage(user)
    if user

        if user.point > 2999
            percentage = ((user.point / 5000.0) * 100 ).to_i
        elsif user.point > 1999
            percentage = ((user.point / 3000.0) * 100 ).to_i
        end

        return percentage

    end
end
4

2 に答える 2

2

基本的な理解が不足しているように見えるので、ここでいくつかの点に焦点を当ててみます。

count_percentageあなたのモデルに属しています。それはあなたのUser記録に結びついていることをする方法です。あなたの例では、コードはUserレコードでのみ使用できます。したがって、それはあなたのクラスに属していますUser!

class User < ActiveRecord::Base
  def percentage
    if self.point > 2999
        return ((self.point / 5000.0) * 100 ).to_i
    elsif user.point > 1999
        return ((self.point / 3000.0) * 100 ).to_i
    else
        # personally, I'd add a case for points range 0...3000
    end
  end

あなたが言ったように、その値を「サイドメニュー」に入れたいので、これにより、たとえば@user.percentage目的のパーセンテージが得られます。

あなたの説明によると(私が正しい方法で理解していれば)、計算された値をユーザーモデルに保存したいと考えています。そして、ここでもう一度説明します。モデル ロジックはモデル クラスに属します。パーセンテージ値を最新の状態に保ちたい場合は、次のようなコールバックを追加します。

class User < ActiveRecord::Base
  before_save :store_percentage

  def precentage
    # your code here
  end


  private

  def store_percentage
    self.my_percentage_field_from_my_database = self.percentage
  end
end

実際の問題: (db) / (ruby) のuser.point可能性があるため、実際に計算する前に変換する必要があります。また、それがあなたの状態でブロックを提案した理由です。あなたがより大きいかどうかにかかわらず値を返すには(それが整数であっても..この場合は疑わしい)。NULLnilto_ielseuser.point1999

于 2013-01-29T09:38:25.050 に答える
1

この質問に答えるには、メソッドuser.pointpercentage値を調べてみてください。count_percentage

私はこじ開けることを強くお勧めします。それは素晴らしいからです。

于 2013-01-29T09:28:10.670 に答える