Ruby on Rails应用程序的只读模式

时间:2010-08-02 21:20:54

标签: ruby-on-rails ruby

我有一个交互式Ruby on Rails应用程序,我希望在某些时候将其置于“只读模式”。这将允许用户读取他们需要的数据,但阻止他们写入数据库的操作。

执行此操作的一种方法是在创建任何写入之前检查数据库中的true / false变量。

我的问题。那个问题有更优雅的解决方案吗?

5 个答案:

答案 0 :(得分:12)

如果您真的想要阻止任何数据库写入,我可以想象的最简单的方法是覆盖模型的readonly?方法,以便始终返回true,无论是在选定的模型中,还是在所有ActiveRecord模型中。如果模型设置为只读(通常通过调用#readonly!来完成),任何尝试保存记录都会引发ActiveRecord::ReadOnlyRecord错误。

module ActiveRecord
  class Base
    def readonly?
      true
    end
  end
end

(实际上未经测试的代码,但你明白了......)

答案 1 :(得分:2)

权限插件?像cancan这样简单的东西,您可以在其中定义用户可以执行的操作。它允许您显示或不显示链接,并限制对控制器操作的访问。 railscast会比我更好地解释。

http://github.com/ryanb/cancan

http://railscasts.com/episodes/192-authorization-with-cancan

答案 2 :(得分:2)

我更喜欢的另一个好人是Declarative Authorization 这也是Railscasts所涵盖的:Railscasts - Declarative Authorization

答案 3 :(得分:0)

Zargony的答案会很好,但是如果您的应用程序尝试编写任何内容,则会引发异常。如果希望您的应用程序在写入时静默失败,以使它不会在每个操作中显示错误页面(例如,如果您在代码登录时更新时间戳,则会出现异常),可以使用以下方法: / p>

before_deploy:
  if ! [[ $TRAVIS_TAG ]]; then
    export TRAVIS_TAG="1.$TRAVIS_BUILD_NUMBER" &&
    git config --local user.name "$USER_NAME" &&
    git config --local user.email "$USER_EMAIL" &&
    git tag "$TRAVIS_TAG" "$TRAVIS_COMMIT";
  fi

答案 4 :(得分:0)

Zargony的解决方案似乎是最好的解决方案,但我想补充一点。

那么,关于他的代码:

这很好用。一个好的解决方案是将其添加到初始化程序中,并仅在设置了env var的情况下运行此代码,以便您可以选择在启动应用程序时是否以只读模式运行该应用程序。

if ENV['READ_ONLY'] == 'true'
  module ActiveRecord
    class Base
      def readonly?
        true
      end
    end
  end
end

然后从READ_ONLY=true bin/rails s之类的命令提示符下运行服务器。另外,添加

rescue_from ActiveRecord::ReadOnlyRecord, with: ->() {
  flash[:alert] = "The site is running in read-only mode. We are going to return to full operation soon. Thank you for your patience!"
  redirect_to root_path
}

向ApplicationController(您的所有控制器都应继承)是向用户显示正在发生什么的好方法。