【问题标题】:Rails - Assigning values to data entered by users in a model's form?Rails - 为用户以模型形式输入的数据分配值?
【发布时间】:2011-09-16 01:27:17
【问题描述】:

我有一个模型,统计,它有 6 个字符模型的统计数据。用户可以输入力量、智力等值。我想要做的是根据用户输入的值自动分配奖金或罚款的值。例如,如果输入 10 或 11,则红利为 0。如果输入 14 或 15,则为 2。有关如何编写此方法的任何提示?谢谢!


这是一个很大的帮助,但我遇到了另一个障碍。我在 Characters 控制器的 Show 方法中这样定义:

@con_modifier = @character.statistic.con_modifier

所以我可以从我的角色视图(显示大部分信息)中调用它。我有一个坚韧保存模型,我想在逻辑中使用 con_modifier 来计算总数。如何正确称呼外国模特?我有:

def total
  fortitude_base.to_i + ability.to_i + magic.to_i + misc.to_i
end

我尝试将其更改为:

def total
  fortitude_base.to_i + @con_modifier + magic.to_i + misc.to_i
end

然后我得到这个错误:

nil can't be coerced into Fixnum

显然它没有调用正确的信息。有任何想法吗?我是否也需要在我的 Fortitudes 控制器中定义它,或者我可以简单地在 Fortitude 模型中定义它并以这种方式在视图中调用它?

【问题讨论】:

    标签: ruby-on-rails methods model fixnum


    【解决方案1】:

    闻起来像 D&D。查阅我的旧玩家手册表明,n 属性值的修饰符只是 (n - 10) / 2

    因此,您只需通过这个简单的公式获得属性值,您就可以获得修饰符。我可能在 Attribute 类中有一个类方法:

    class Attribute
        #...
        def self.modifier_for(attribute_score)
            (attribute_score.to_i - 10) / 2
        end
    end
    

    然后将其连接到您的播放器,如下所示:

    class Player
        #...
        def wis_modifier
            Attribute.modifier_for(wis)
        end
        def modifier(attr)
            self.send(attr.to_s + '_modifier')
        end
    end
    
    will_save += p.modifier(:wis)
    

    如果你愿意,你可能会变得更漂亮,但简单是一个好的开始,如果需要,你总是可以让你当地的牧师来修复你的代码(或使用你的代码重构的 +3 火焰斧)。

    【讨论】:

    • 是的,免打扰!我正在开发一个角色表应用程序,我想我会为玩家省去一些麻烦,并使可以自动化的东西自动化。但是,您展示的逻辑将如何处理奇数分数? 19 也有 +4 修饰符(如 18),但逻辑将其显示为 9 / 2 或 4.5。 .to_i 会自动将其四舍五入为 4,还是有办法将小数四舍五入?
    • @illbzo1:我添加了 to_i 作为一种偏执狂,以强制算术进入 Fixnum 模式,因此所有操作都将使用 9/2 为 4 且 -5/2 为 -3 的整数完成.如果您的分数已经是 Fixnums,那么您根本不需要 to_i。如果您最终进入浮点领域,那么 Float 上还有 floor 方法。
    • 相当肯定它们是 fixnums,因为我在发布此问题之前尝试的逻辑出现了与 fixnum 相关的错误。今天晚上我会看看并尝试你展示的方法。感谢您消除我对 to_i 和舍入的困惑,顺便说一句!
    • @illbzo1:如果它们是 Fixnums,那么您可以删除 to_i。您只需要确保正确处理缺失的属性(例如巨型黄蜂的 Int),否则您将收到 nil 错误。
    猜你喜欢
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    • 1970-01-01
    相关资源
    最近更新 更多