2013-03-11 131 views
0

我有一個用戶模型,其中包含2個布爾值在數據庫中 - 管理員和只讀。基本上這允許我有3個訪問級別(只讀,可編輯和管理員)。Rails如何使用虛擬屬性f.select

我有一個屏幕,允許管理員編輯其他用戶的權限。我使用f.select創建了一個下拉列表,並且創建了一個名爲「permission」的虛擬屬性,而不是有2個複選框用於布爾值admin和readonly。

當保存用戶權限時,一切都可以正常工作,唯一的問題是,當您轉到某個用戶的編輯頁面時,它不會在下拉列表中以用戶的實際權限加載該頁面。它只是加載下拉中的第一個值作爲默認值。

我該如何做到這一點,所以當第一次加載用戶編輯頁面時,此下拉菜單顯示用戶的實際權限?

這裏是我的虛擬屬性代碼爲我的用戶模型:

# get the permission 
    def permission 
     if self.read_only 
      @permission = 'readonly' 
     elsif self.admin 
      @permission = 'admin' 
     else 
      @permission = 'editable' 
     end 
    end 

    # Set the permission. 
    def permission=(value) 
     p "VALUE = #{value}" 
     if value == 'readonly' 
      self.read_only = true 
      self.admin = false 
      @permission = 'readonly' 
     elsif value == 'admin' 
      p "INSIDE admin" 
      self.read_only = false 
      p "before #{self.admin}" 
      self.admin = true 
      p "after #{self.admin}" 
      @permission = 'admin' 
     elsif value == 'editable' 
      self.read_only = false 
      self.admin = false 
      @permission = 'editable' 
     end 
    end 

,這裏是我在我的表單視圖f.select:

<%= f.select :permission, options_for_select([['Admin', 'admin'], ['Read Only', 'readonly'], ['Editable', 'editable']], {:disabled => @permissions_disabled}) %> 

我試着用collection_select,但無法弄清楚如何填充列表。

回答

2

Rails f.select trying to disable a dropdown from being changed說,你不需要的options_for_select。如果您刪除它並傳遞第四個參數a selected選項,則應該設置。

<%= f.select :permission, [['admin', 'Admin'], ['readonly', 'Read Only'], ['editable', 'Editable']], { selected: 'readonly' }, { disabled: @permissions_disabled } %> 

但鑑於上面的代碼,即使沒有selected選項,只要f.object.permission返回正確的價值,你應該罰款。

+0

啊是的,刪除'options_for_select'它有頁面加載時的選定值。 – Catfish 2013-03-11 13:14:58

0

嘗試添加以下內容到末尾的散列選項::selected => @user.permission

例如:

<%= f.select :permission, options_for_select([['Admin', 'admin'], ['Read Only', 'readonly'], ['Editable', 'editable']], {:disabled => @permissions_disabled, :selected => @user.permission}) %>