slim 中的局部变量三元赋值

Local variable ternary assignment in slim

我有一个像这样的苗条部分:

- name = (defined?(name) ? name : 'tags')
- id = (defined?(id) ? id : ('input-' + name))
- label = defined?(label) ? label : nil
- placeholder = defined?(placeholder) ? placeholder : nil
- className = defined?(className) ? className : nil
- prefetch = defined?(prefetch) ? prefetch : nil
- displayKey = defined?(displayKey) ? displayKey : nil
- valueKey = defined?(valueKey) ? valueKey : nil

.input-container.tags
  - if label
    label for="#{id}" = label
  input type="text" id="#{id}" name="#{name}" placeholder="#{placeholder}" data-prefetch="#{prefetch}" data-displayKey="#{displayKey}" data-valueKey="#{valueKey}"

当我使用它(通过 ==render)并在内部传递局部变量时 — 一切正常。

但是当我省略时,例如,名称 - 它不会分配给默认值 'tags'。 id 也是一样。它们只是空的。如果我在一开始就注释掉赋值——如预期的那样,会出现未定义变量错误。

作业有什么问题?

你不需要苗条。只需 irb 代码:

name = (defined?(name) ? name : 'tags')
p name #=> nil

是不行的,因为你在语句name = ...的左边隐式定义了name。因此,当 Ruby 解释器评估 defined?(name) 时,它给出了真实的结果。

我想你已经得到答案了:

unless defined?(name)
  name = 'tags'
end

或更短:

name ||= 'tags'