我是Rails的新手,我正在尝试制作宠物应用。它有3个属性:名字,饥饿和心情。我生成了一个脚手架,并在模型中编写了一个feed方法:
def feed
self.hungry==false;
save!
end
我希望Feed能够成为用户在编辑视图中可以执行的操作,因此我创建了一个复选框来指示喂食与不喂食。我的计划是在更新功能中从控制器调用feed函数。现在,它看起来像这样:
def update
respond_to do |format|
if @pet.update(pet_params)
format.html { redirect_to @pet, notice: 'Pet was successfully updated. #{params[:feed]}' }
format.json { head :no_content }
else
format.html { render action: 'edit' }
format.json { render json: @pet.errors, status: :unprocessable_entity }
end
end
if @pet.update_attributes(params[:feed])
@pet.feed
end
end
我有一种奇怪的感觉,我在这里混合隐喻,但我不确定正确的行动方案。我正在尝试从我的更新功能调用一个函数,这似乎不起作用。这可能与我的模型参数中没有列出“feed”这一事实有关,但我并不需要它。我只需要它来调用一个函数。救命啊!
答案 0 :(得分:0)
您的方法定义错误。您没有分配值,而是在比较相等性。
def feed
self.hungry == false; # only one = should be used.
save!
end
然而,还有更好的方法:
class Pet
attr_accessor :feed_me
before_save :feed
def feed
hungry = false if feed_me
end
end
您不需要控制器检查:
if @pet.update_attributes(params[:feed])
@pet.feed
end
顺便说一句,哪个错了。您需要检查param[:feed]
是否存在,而不是pet objet是否已正确更新。
要使此解决方案正常工作,您需要在表单中添加一个属性:
= f.check_box :feed_me
另一种方法是将hungry
属性映射到复选框,只需为标签Feed命名:
= f.label :hungry, "Feed"
= f.checkbox :hungry
然后您可以继续删除before_save
,attr_accessor
和方法self.feed
。