Rails如何将f.select与虚拟属性一起使用

时间:2013-03-11 06:45:47

标签: ruby-on-rails ruby ruby-on-rails-3

我有一个用户模型,在数据库中包含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,但无法弄清楚如何填充列表。

2 个答案:

答案 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}) %>