2013-09-21 51 views
0

我试图制作一个宠物栏应用程序。我的宠物模型包含两个布尔值饥饿和feed_me。现在,饥饿和feed_me都可以在视图中设置,但我试图设置模型,以便如果feed_me为true,饥饿会自动更改为false。然而,无论我做什么,feed_me都不会重置饥饿。这是我在现在的模式:使用Rails模型更新以基于另一个更改一个布尔值

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哈希表,所以我很困惑,为什么我不能用它重置值。

+0

你所需要的:feed_me列?您可以通过只有一个:饥饿的布尔列来简化您的Creature模型。例如,如果feed_me只是在一个生物已经饥饿5小时后才会发生,那么您可以即时计算,而不是存储在数据库中。 – danneu

+0

你知道吗,我不认为我真的需要它 - 我想让用户有能力在饥饿的时候喂养宠物,并使它不饿。这是我应该用辅助函数做的事吗? – USK

+0

你甚至可以只有'last_fed_at'列(日期时间)。这样你就可以拥有一个像这样实现的'@ creature.hungry?'方法:'last_fed_at> 5.hours.ago'(生物只有在5小时内没有喂食的时候才会饿)。那么你可以有一些逻辑:if @ creature.hungry?然后显示FEED ME按钮。 FEED ME按钮只是调用'@ creature.feed'方法,它会执行'@ creature.update_column(:last_fed_at,Time.now)'。现在@ creature.hungry?由于其last_fed_at已更新至现在,因此为false。那有意义吗? – danneu

回答

2

您正在使用模型回调的正确轨道,但是模型无法访问param散列 - 它可用于控制器。

该模型已经知道它自己的属性的价值,所以你不需要从params中得到它们。我想像的控制器正在更新feed_me

另外,假设它由数据库列支持,您也不需要声明feed_meattr_accessor

您可以更改before_save到:

def feed 
    if self.feed_me 
    self.hungry = false 
    end 
end 

在你的控制,我想你会做这样的事情:

def update 
    pet = Pet.find(params[:id]) 
    pet.feed_me = params[:feed_me] 

    if pet.save 
    redirect_to pet_path(pet) 
    else 
    flash[:notice] = 'Error saving pet' 
    render :edit 
    end 
end 
+0

这里是控制器貌似现在:'''高清更新 生物= Creature.find(PARAMS [:编号]) creature.feed_me =参数[:feed_me] creature.hungry =参数[:饿] 的respond_to做|格式| if @ creature.update(creature_params) format.html {redirect_to @creature,注意:'Creature已成功更新。 #{params [:feed]}'} format.json {head:no_content} else format.html {render action:'edit'} format.json {render json:@creature。错误,状态::unprocessable_entity} end end end''' – USK

+0

我也更新了模型,正如你所建议的 - 我很困惑,现在实际上饲料何时被调用。我会从控制器那里做到吗? – USK

+0

如果您在模型中现在有一个'before_save:feed',就像Michael建议的那样,它会在保存模型的过程中调用 - 当您调用@ creature.update时,最初在您的控制器中触发它。 – trueunlessfalse