【发布时间】:2013-09-21 19:03:32
【问题描述】:
我正在尝试制作一个宠物轨道应用程序。我的宠物模型包含两个布尔值,饥饿和 feed_me。现在,可以在视图中设置饥饿和 feed_me,但我正在尝试设置模型,以便如果 feed_me 为真,饥饿将自动更改为假。然而,无论我做什么,feed_me 都不会重置饥饿。这就是我现在模型中的内容:
attr_accessor :feed_me
before_save :feed
def feed
@feed_me = Creature.find(params[:feed_me])
@hungry=Creature.find(params[:hungry])
if @feed_me==true
@hungry=false
end
end
我是 Rails 新手,但我的理解是模型应该可以访问 params 哈希,所以我很困惑为什么我不能使用它来重置值。
【问题讨论】:
-
您需要 :feed_me 栏吗?你可以通过一个 :hungry 布尔列来简化你的 Creature 模型。例如,如果 :feed_me 是在一个生物 :hungry 5 小时后才发生的事情,那么你可以即时计算而不是存储在数据库中。
-
你知道,我不认为我真的需要它——我想让用户能够在宠物饿的时候喂它,让它不饿。这是我应该用辅助函数做的吗?
-
您甚至可以只拥有一个
last_fed_at列(日期时间)。这样你就可以有一个@creature.hungry?方法,它是这样实现的:last_fed_at > 5.hours.ago(只有在 5 小时内没有被喂食的生物才会饿)。那么你可以有一些逻辑:如果@creature.hungry?然后显示 FEED ME 按钮。并且 FEED ME 按钮只调用@creature.feed方法,该方法执行@creature.update_column(:last_fed_at, Time.now)。现在@creature.hungry?是错误的,因为它的 last_fed_at 已更新到现在。这有意义吗? -
这真是个好主意 - 我可以把它放在视图中吗?
-
在视图中,您可以输入
if @creature.hungry? then display <FEED BUTTON>。将指向 CreaturesController#feed操作。feed操作可以有代码if @c = current_user.creatures.find(params[:id]) && @c.feed then redirect_to(@c, notice: "Creature was fed!")。显然,我在此评论中没有太多空间,但我希望你能明白。
标签: ruby-on-rails ruby ruby-on-rails-3