Rails不会保存布尔“隐藏”值但保存其他值

时间:2010-11-07 00:26:49

标签: ruby-on-rails activerecord model

我对Rails有点新手,我有一个简单的应用程序和一些故事。我想让这个功能轻松隐藏我现在不想出现的故事。其他函数设置方式相同,除了这个具有布尔值。

  def hide
    @story = Story.find(params[:id])
    @story.hidden = true

    if @story.save
      redirect_to :controller => 'pages', :action => 'home'
    else
      redirect_to :controller => 'stories', :action => 'show', :id => @story.id
    end
  end

由于某些原因,当此函数运行时,它不会更新Story的“hidden”属性,但@ story.save返回true(它执行if语句的第一部分)。我设置错误来设置@ story.hidden = true吗?我正在使用sqlite,如果这很重要的话。谢谢!

3 个答案:

答案 0 :(得分:0)

如果这只是将布尔属性更新为true,那么你可以这样做:

def hide
    @story = Story.find(params[:id])
    @story.update_attribute(:hidden, true)
    redirect_to :controller => 'pages', :action => 'home'
end

答案 1 :(得分:0)

那么,首先,您为什么要使用自定义操作?这应该进入控制器中的更新操作,你应该通过表单传递布尔值。

现在,针对您的具体问题,检查@story变量是否修改了对象,但是这样做:

logger.debug @story.changed?

如果返回true,则表示应该更新记录,并且您应该查看日志以确定UPDATE语句到底是什么。你应该把它发回到这里。

答案 2 :(得分:0)

使用update_attributes!:它不会跳过验证,并会在错误上抛出异常。
另外请考虑使用rescue,因为Story.find()update_attributes!可能会失败。

def hide
  @story = Story.find(params[:id]).update_attributes!(:hidden => true)
  redirect_to :controller => 'pages', :action => 'home'
end