Ruby on Rails中的text_field禁用

19

我有以下代码可以在用户不是管理员时禁用一个 text_field,它运行良好:

<div class="form-group">
<%= f.label :nome, "Genero" %>
<%= f.text_field :nome, class: "form-control", disabled: true if not is_admin? %>
</div>

但是当用户是管理员时,text_field 就消失了。 有人知道这是为什么,以及我该怎么做吗?


控制台没有错误信息吗?如果条件不是真的,为什么不直接使用disabled: !is_admin?呢? - Dave Newton
2个回答

41
假设is_admin?返回truefalse,你可以简单地执行以下操作:
<%= f.text_field :nome, class: "form-control", disabled: !is_admin? %>

目前,if条件,即if not is_admin?应用于整个文本字段,当is_admin?返回true时,文本字段会消失,当条件返回false时,文本字段将显示。


谢谢!那个有效了,我想知道为什么当我用管理员帐户登录时,disabled: true if not is_admin 出了问题。 - Vitor Vezani
1
我实际上在答案中解释了原因。就像if condition在文本字段上充当修饰符一样,所以只有当if condition中的条件为true时,文本字段才会显示出来。在你的情况下,条件是if not is_admin?。当使用管理员账户登录时,is_admin?返回true,所以not is_admin?变成了false,这就是为什么文本字段没有显示,因为条件是false - Kirti Thorat

5
您的代码不能按预期工作的具体原因是运算符优先级问题 - if测试应用于整个文本字段,而不仅仅是disabled参数。
最直接的解决方案(尽管不一定是最好的)是将true if not is_admin?括在括号中。
<%= f.text_field :nome, class: "form-control", disabled: (true if not is_admin?) %>

否则,整个文本字段都将应用if,如下所示:
<%= (f.text_field :nome, class: "form-control", disabled: true) if not is_admin? %>

所以它只适用于非管理员用户 - 即当 is_admin? 为 false 时才渲染。
此外,当它被渲染时,它将始终是禁用状态。 (这一点有好处,可以让非管理员更难滥用。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接