我有一个用户模型,在数据库中包含2个布尔值 - admin和readonly。基本上这允许我有3级访问权限(只读,可编辑和管理员)。
我有一个允许管理员编辑其他用户权限的屏幕。我没有为admin和readonly的布尔值设置2个复选框,而是使用f.select创建了一个下拉列表,并创建了一个名为" permission"的虚拟属性。
在保存用户权限时,一切正常,唯一的一点就是当你转到特定用户的编辑页面时,它不会加载具有用户实际权限的页面。落下。它只是将下拉列表中的第一个值加载为默认值。
如何进行此操作以便此下拉列表在首次加载用户编辑页面时显示用户的实际权限?
这是我的用户模型的虚拟属性代码:
# 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,但无法弄清楚如何填充列表。
答案 0 :(得分:2)
如Rails f.select trying to disable a dropdown from being changed中所述,您不需要options_for_select
。如果删除它并传递第四个参数selected
选项,则应设置。
<%= f.select :permission, [['admin', 'Admin'], ['readonly', 'Read Only'], ['editable', 'Editable']], { selected: 'readonly' }, { disabled: @permissions_disabled } %>
但是考虑到上面的代码,即使没有selected
选项,只要f.object.permission返回正确的值,你应该没问题。
答案 1 :(得分:0)
尝试将此添加到您的上一个选项哈希::selected => @user.permission
例如:
<%= f.select :permission, options_for_select([['Admin', 'admin'], ['Read Only', 'readonly'], ['Editable', 'editable']], {:disabled => @permissions_disabled, :selected => @user.permission}) %>