提示选项不与select_tag一起使用

时间:2018-05-24 10:42:58

标签: ruby-on-rails haml

如果marital_status中有值,则不应显示提示,但在我的情况下显示。我的代码如下所述。请帮忙。

= select_tag( 'request[marital_status]', 
options_for_select(marital_status_options,
@employee.marital_status.try(:upcase)), prompt: "Select Marital Status", id: 'employee_marital_status', disabled: @request.submitted?)

在employee_helper.rb

def marital_status_options
  Employee::MaritalStatus::ALL.zip(Employee::MaritalStatus::ALL)
end

员工模式

module MaritalStatus
  MARRIED = 'MARRIED'
  SINGLE = 'SINGLE'
  DIVORCED = 'DIVORCED'
  ALL = [MARRIED, SINGLE, DIVORCED]
end

3 个答案:

答案 0 :(得分:0)

格式和用法是正确的。请验证@employee.marital_status.try(:upcase)是否与此处提供的marital_status_options完全匹配。

这似乎是这种行为的可能情况。

此外,select_tag中预期的第一个参数需要采用适当的格式,在本例中为一个字符串数组。

因此,您的方法marital_status_options应该返回一个用于下拉列表的选项数组。

def marital_status_options
  ['MARRIED', 'SINGLE', 'DIVORCED']
end

答案 1 :(得分:0)

你非常接近。这里的问题可能源于您的marital_status_options方法:由于您的分配,它会在评估到最后一行时返回DIVORCED

因此,如果您的实例包含“DIVORCED”,您可能会发现该值已被选中,但不是其他任何值;您的实例的值需要匹配其中一个,以便选择它而不是提示。

您可能想要更改此内容:

def marital_status_options
  MARRIED = 'MARRIED' # this will be evaluated first
  SINGLE = 'SINGLE' # then this
  DIVORCED = 'DIVORCED' # finally, this will be evaluated and returned as 'DIVORCED'
end

到一个数组:

def marital_status_options
  ['MARRIED', 'SINGLE', 'DIVORCED']
end

或者,将选项显示为小写但在db中保留大写值:

def marital_status_options
  [['Married', 'MARRIED'], ['Single', 'SINGLE'], ['Divorced', 'DIVORCED']]
end

查看options_for_select上的文档,您将看到可以设置的人员。

更进一步,您可能需要考虑切换到enums - 这些非常便于管理这些选项,并自动生成Employee.marriedemployee.divorced?等方法,等等。

正如其他人提到的那样,最好将相关数据存储在相关模型中,尽管我认为这些应该存储为常量,因为它们不会改变。所以下列之一:

# employee.rb
MARITAL_STATUSES = ['MARRIED', 'SINGLE', 'DIVORCED'].freeze
# or
MARITAL_STATUSES = [['Married', 'MARRIED'], ['Single', 'SINGLE'], ['Divorced', 'DIVORCED']].freeze

= select_tag('request[marital_status]', 
             options_for_select(Employee::MARITAL_STATUSES,
                                @employee.marital_status.try(:upcase)), 
             prompt: "Select Marital Status", 
             id: 'employee_marital_status', 
             disabled: @request.submitted?)

希望有所帮助 - 如果您有任何疑问或需要其他任何内容,请与我联系。

答案 2 :(得分:-1)

= select_tag "request[marital_status]", options_for_select(Employee.marital_status_options,
@employee.marital_status.try(:upcase)), :include_blank => '--Select Marital Status--', id: id: 'employee_marital_status', disabled: @request.submitted?

在模型中定义marital_status_options(业务逻辑)是一种很好的做法: -

假设它是员工模型

def self.marital_status_options
  [
    ["MARRIED","MARRIED"],
    ["SINGLE","SINGLE"],
    ["DIVORCED", "DIVORCED"]
  ]
end

没有选择默认的marital_status的原因是因为如果@employee.marital_status.try(:upcase)marital_status_options中的任何一个都不匹配,它会显示您的prompt选项,因此请仔细检查如果@employee.marital_status.try(:upcase)与select tag的选项中的任何给定选项匹配,则