2013-03-11 100 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}) %>