1

我是 Rails 的新手,正在尝试制作一个宠物应用程序。它有 3 个属性:名称、饥饿和心情。我生成了一个脚手架,并在模型中写入了一个 feed 方法:

def feed
 self.hungry==false;
 save!
end

我希望提要成为用户可以在编辑视图中执行的操作,因此我创建了一个复选框来指示喂食与不喂食。我的计划是在更新函数中从控制器调用 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”未列在我的模型参数中的事实有关,但我不需要它。我只需要它来调用一个函数。帮助!

4

1 回答 1

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]存在,而不是宠物对象是否已正确更新。

要使此解决方案起作用,您需要在表单中添加一个属性:

= f.check_box :feed_me

另一种方法是将hungry属性映射到复选框并命名标签提要:

= f.label :hungry, "Feed"
= f.checkbox :hungry

然后,您可以继续删除before_saveattr_accessor和 方法self.feed

于 2013-09-19T21:04:48.550 回答