[英]Read only mode for Ruby on Rails application
我有一個交互式Ruby on Rails應用程序,我希望在某些時候將其置於“只讀模式”。 這將允許用戶讀取他們需要的數據,但阻止他們寫入數據庫的操作。
執行此操作的一種方法是在創建任何寫入之前檢查數據庫中的true / false變量。
我的問題。 這個問題有更優雅的解決方案嗎?
如果你真的想阻止任何數據庫寫,我能想象的最簡單的方法是覆蓋readonly?
模型的方法總是返回true,無論是在選定的模型中,還是在所有ActiveRecord模型中。 如果模型設置為readonly(通常通過調用#readonly!
來完成),任何嘗試保存記錄都會引發ActiveRecord::ReadOnlyRecord
錯誤。
module ActiveRecord
class Base
def readonly?
true
end
end
end
(實際上是未經測試的代碼,但你明白了......)
權限插件? 像cancan這樣簡單的東西,您可以在其中定義用戶可以執行的操作。 它允許您顯示或不顯示鏈接,並限制對控制器操作的訪問。 railscast將比我更好地解釋。
http://github.com/ryanb/cancan
http://railscasts.com/episodes/192-authorization-with-cancan
另一個我更喜歡的好的是聲明授權 ,它也被Railscasts覆蓋: Railscasts - 聲明授權
Zargony的答案會很好,但如果你的應用程序試圖編寫任何內容,則會引發異常。 如果您希望應用程序在寫入時無聲地失敗,以便它不會在每個操作上顯示錯誤頁面(例如,如果您在代碼中更新登錄時間戳,則會出現異常),您可以使用以下方法:
unless Rails.env.test?
class ActiveRecord::Base
before_save do
raise ActiveRecord::Rollback, "Read-only"
end
before_destroy do
raise ActiveRecord::Rollback, "Read-only"
end
end
end
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(所有控制器都應該繼承)是向用戶顯示正在發生的事情的好方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.