【问题标题】:Rails: Setting a value to input field if variable existsRails:如果变量存在,则为输入字段设置值
【发布时间】:2015-07-29 19:29:46
【问题描述】:

当将 id 传递给控制器​​中的新操作时,我正在尝试为两个文本字段输入设置一个值。当前代码有效,但我想知道代码是否可以缩短。

当前代码

查看

<div class="custom-input">
  <% if @debtor %>
    <input type="text" name="debtor_name" class="form-control" id="debtor-search-form" value='<%= @debtor.name %>'>
  <% else %>
    <input type="text" name="debtor_name" class="form-control" id="debtor-search-form">
  <% end %>
</div>
<% if @debtor %>
  <%= f.text_field :debtor_id, class: "form-control", value: @debtor.id %>
<% else %>
  <%= f.text_field :debtor_id, class: "form-control" %>
<% end %>

我尝试删除 if-else 部分以缩短代码

更短的代码

查看

<div class="custom-input">
    <input type="text" name="debtor_name" class="form-control" id="debtor-search-form" value='<%= @debtor.name if @debtor %>'>
</div>
<%= f.text_field :debtor_id, class: "form-control", value: @debtor.id if @debtor %>

当没有债务人被传递时,缩短的代码导致第一个输入具有“悬挂”值标签(即它只显示值。后面没有等号)

<input type="text" name="debtor_name" class="form-control ui-autocomplete-input" id="debtor-search-form" value autocomplete="off">

当第二个输入消失时。

“悬挂”价值标签可以吗?我检查了 html,如果我单击“编辑为 html”,则“挂起”值标签解析为 value=""

有没有办法缩短代码还是我应该坚持下去?

【问题讨论】:

  • 这是表单的一部分还是只是没有forminput 字段?
  • @ABMagil 是的,是表单的一部分。只是参加了我试图缩短的部分

标签: ruby-on-rails ruby-on-rails-4 erb


【解决方案1】:

在 HTML5 中,只有 value 的 HTML 属性很好。此外,根据您的html.erb 代码判断,原始 HTML 源代码可能读作value=''
我猜你正在使用 Chrome 或 Firefox 的开发工具,它会尝试更正并为你格式化看起来很奇怪的 HTML,并且可能会在没有空 ='' 的情况下显示它。

那么问题来了:

<%= f.text_field :debtor_id, class: "form-control", value: @debtor.id if @debtor %>

是运算符优先级。您的 if 适用于整个声明。
尝试:

<%= f.text_field :debtor_id, class: "form-control", value: (@debtor.id if @debtor) %>

或者:

<%= f.text_field :debtor_id, class: "form-control", value: @debtor.try!(:id) %>

【讨论】:

  • 从没想过“value:”中的括号会解决这个问题,即使没有定义@debtor,“try”也会起作用。很酷。
  • 那是因为@instance变量默认为nil,而ActiveSupport添加了NilClass#try
【解决方案2】:

悬挂的价值标签没有任何区别。如您所见,它与value="" 相同,这是“默认”值。它也是完全有效的 HTML5。

【讨论】:

    【解决方案3】:

    你可以试试try object

    <div class="custom-input">      
      <input type="text" name="debtor_name" class="form-control" id="debtor-search-form" value='<%= @debtor.try(:name) %>'>
    </div>
    <%= f.text_field :debtor_id, class: "form-control", value: @debtor.try(:id) %>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-23
      • 2012-11-17
      • 2018-10-05
      • 2013-03-23
      相关资源
      最近更新 更多