【问题标题】:How to set a field read only in rails 3.1.0 views?如何在 rails 3.1.0 视图中设置只读字段?
【发布时间】:2012-02-02 22:22:37
【问题描述】:

我的问题是如何将 Rails 表单中的字段设置为只读。以下是报价控制器中的选择框。不允许用户更改选择。

  <% @quote.test_items.each do |t| %> 
    <%= f.association :test_items, :label => false, :selected => t.id %>
  <% end %>

应用程序使用 simple_form。非常感谢。

【问题讨论】:

  • 在 rails 4+ 中有 readonly : true 现在。 disabled: true 也有效

标签: ruby-on-rails ruby-on-rails-3.1 simple-form


【解决方案1】:

我也遇到过类似的问题,幸好有一个简单的解决方法。

基本问题是,如果您将 :disabled =&gt; true 与 simple_form 一起使用,您将不会在控制器中看到该值。当您从 HTML 表单传递对象以稍后将其绑定到模型时 - 您需要所有这些属性。但是:disabled =&gt; true 没有传递任何此类属性。

解决方案是使用:readonly =&gt; true - 它会保护该字段不被用户输入,它仍然会将参数值传递回控制器,以便您可以将所有内容绑定到您的模型。

祝你好运。

https://github.com/plataformatec/simple_form/pull/367

【讨论】:

  • 这个答案与问题最相关,IMO。应该选为正确的。
  • 我还发现关联可能不尊重 readonly 标志并最终使用 disabled 来满足我的需要
【解决方案2】:

我相信你会通过:disabled =&gt; true。根据我的经验,选项与 simple_form 一起“正常工作”。所以在你的情况下:

<% @quote.test_items.each do |t| %> 
  <%= f.association :test_items, :label => false, :disabled => true, :selected => t.id %>
<% end %>

来自simple_form github repo

还可以为 SimpleForm 提供 :disabled 选项,它会使用 css 类自动将包装器标记为禁用,因此您也可以在包装器内设置标签、提示和其他组件的样式。

【讨论】:

  • :disabled => true 使选择变灰并使选择不可更改。但是,它也不允许服务器检索选择的值。应用程序需要将选择值传递给服务器。感谢您的想法。
  • 你想完成什么?显然,表单元素不是您要寻找的,因为无论如何您都希望它被禁用。您是否尝试为表单设置默认值?
  • 我们首先需要的是一个只读字段。该字段的值是从数据库中继承的,不需要用户选择。该应用程序还允许用户完全删除一个字段。这就是为什么我们需要将值发送到服务器。 :disabled => true 完成了 readonly 的目标,第二个失败了,即将值发送到服务器。如果禁用字段可以在发布到服务器之前设置为 false,它可能会起作用。
  • 所以,您应该这样做 - 要么:在控制器中设置属性值,然后将其发送到视图,然后将隐藏字段添加到表单,或者,将属性值设置为提交表单后的控制器。用户是否需要查看此属性?
【解决方案3】:

是的,@gk0r 说的是documented here

注意:HTML 选项 disabledreadonlymultiple 都可以被视为布尔值。所以指定:disabled =&gt; true 将给出disabled="disabled"

*disabled 的行为与 readonly 略有不同。

【讨论】:

    【解决方案4】:

    上面的答案都是错误的。

    disabled 属性的行为与 readonly 不同。

    阅读并比较它们:

    http://www.w3schools.com/tags/att_input_disabled.asp

    提示:表单中禁用的元素将不会被提交。

    http://www.w3schools.com/tags/att_input_readonly.asp

    正确的答案是使用

    :readonly => true
    

    类似这样的:

    <%= f.association :test_items, :label => false, :readonly => true, :selected => t.id %>
    

    【讨论】:

      【解决方案5】:

      我不清楚关联方法是否接受 HTML 选项,但如果接受,您可以通过 disabled: 'disable' 使其具有固定值的只读。

      我认为您可以通过将关联作为块传递来选择固定值,如关联文档中所示:

      f.association :company do |c|
        c.input :name, selected: 'selection'
        c.input :type
      end
      

      至于整个列表是否可以只读还是下拉,我从google上看到的唯一解决方案是JS,例如:

      http://techeyes.blogspot.com/2007/11/making-html-select-readonly.html

      【讨论】:

      • 链接中的示例提供了一个解决方案。但我找不到附加的 js 代码,因此无法弄清楚它是如何工作的。谢谢。
      • 还有更多类似铁路的解决方案吗?
      猜你喜欢
      • 2012-12-29
      • 1970-01-01
      • 1970-01-01
      • 2011-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      • 2022-11-28
      相关资源
      最近更新 更多