簡體   English   中英

Ruby on Rails應用程序的只讀模式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM