从Controller调用Rails模型函数

时间:2013-09-19 20:59:54

标签: ruby-on-rails rails-activerecord

我是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”这一事实有关,但我并不需要它。我只需要它来调用一个函数。救命啊!

1 个答案:

答案 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_saveattr_accessor和方法self.feed