【问题标题】:Rails won't save boolean "hidden" value but saves other valuesRails 不会保存布尔“隐藏”值,但会保存其他值
【发布时间】:2010-11-07 00:26:48
【问题描述】:

我对 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 的“隐藏”属性,但 @story.save 返回 true(它执行 if 语句的第一部分)。我在设置@story.hidden = true 时做错了吗?我正在使用 sqlite,如果这很重要的话。谢谢!

【问题讨论】:

    标签: ruby-on-rails activerecord model


    【解决方案1】:

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

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

    【讨论】:

    • 这会绕过记录上的验证。由于 OP 是 Rails 的新手,我认为建议不要这样做,除非您提供这种方法的缺点。
    • 这是一个很好的观点,但对于他们试图实现的目标,它并没有失去任何功能,而是使用静态硬编码更新布尔值
    【解决方案2】:

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

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

    logger.debug @story.changed?
    

    如果返回 true,则意味着应该更新记录,您应该查看日志以确定 UPDATE 语句的真正含义。你应该把它发回这里。

    【讨论】:

      【解决方案3】:

      使用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
      

      【讨论】:

        猜你喜欢
        • 2012-05-05
        • 1970-01-01
        • 2022-08-18
        • 1970-01-01
        • 2011-05-12
        • 1970-01-01
        • 1970-01-01
        • 2013-08-27
        • 2011-08-01
        相关资源
        最近更新 更多