【问题标题】:undefined method `match' for nil:NilClassnil:NilClass 的未定义方法“匹配”
【发布时间】:2014-12-10 18:10:17
【问题描述】:

我正在尝试从文本框中删除不在[] 之间的任何内容。这适用于edit 记录表单:

<%= f.text_field :transport_relay, :value => f.object.transport_relay.match(/\[(.*?)\]/)[1]  %>

但是当我尝试创建new 记录时,它会按预期显示"undefined method `match' for nil:NilClass" 错误,因为新记录没有匹配。我该如何处理这个问题?

我尝试了几种解决方案,即:

<%= f.text_field :transport_relay, :value => f.object.transport_relay.match(/\[(.*?)\]/)[1]  if f.object.transport_relay %>

解决了报错问题,同时也去掉了过程中的输入文本框。

【问题讨论】:

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


    【解决方案1】:

    您希望if 仅应用于 :value 参数,而不是整个 f.text_field。将 () 放在 :value value 周围

     <%= f.text_field :transport_relay, :value => (f.object.transport_relay.match(/\[(.*?)\]/)[1]  if f.object.transport_relay) %>
    

    【讨论】:

    • 这对我来说就像一个魅力:)。感谢大家的投入和所花费的时间。
    【解决方案2】:

    这是很好的 gem 调用 and gem 来处理这个问题(“undefined method `any_method' for nil:NilClass”)。

    【讨论】:

      【解决方案3】:

      你可以这样写

      <%= f.text_field :transport_relay, :value => f.object.transport_relay.nil? ? nil:f.object.transport_relay.match(/\[(.*?)\]/)[1]  %>
      

      但我认为如果你将逻辑提取到你的模型中会更好

      def transport_relay_value
        transport_relay.nil? nil:transport_relay.match(/\[(.*?)\]/)[1]
      end
      
      <%= f.text_field :transport_relay, :value => f.object.transport_relay_value  %>
      

      【讨论】:

        【解决方案4】:

        试试这个:def nil.match; nil end

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-07-27
          • 2013-06-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多