我有一个交互式Ruby on Rails应用程序,我希望在某些时候将其置于“只读模式”。这将允许用户读取他们需要的数据,但阻止他们写入数据库的操作。
执行此操作的一种方法是在创建任何写入之前检查数据库中的true / false变量。
我的问题。那个问题有更优雅的解决方案吗?
答案 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(您的所有控制器都应继承)是向用户显示正在发生什么的好方法。