简体   繁体   中英

prompt option not working with select_tag

If there is value in marital_status then prompt should not be displayed but in my case it's displaying. My code is mentioned below. Please help.

= 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?)

In employee_helper.rb

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

In employee model

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

The format and usage is correct. Kindly verify if @employee.marital_status.try(:upcase) exactly matches one of the marital_status_options provided here.

That looks like a probable case for such a behaviour.

Also, the first argument expected in select_tag needs to in an appropriate format, in this case, an array of strings.

Hence, your method marital_status_options should return an array of options to be used for dropdown.

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

You're very close. The problem here likely stems from your marital_status_options method: this will simply return DIVORCED as it evaluates to the last line due to your assignment.

Therefore, you might find the value is selected if your instance contains 'DIVORCED', though not either of the other values; your instance's value needs to match one of these for it to be selected instead of the prompt.

You likely want to change this:

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

To an array, either:

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

Or, to present the options as lowercase but keep uppercase values in the db:

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

Take a look at the docs on options_for_select and you'll see who they can be setup.

Further down the line, you might want to consider switching to enums - these are very handy for managing selections such as these, and auto generate methods such as Employee.married , employee.divorced? , and so forth.

As someone else has mentioned, it's best practice to store data such as this in the relevant model, though I'd argue these should be stored as a constant as they won't be changing. So one of the following:

# 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?)

Hope that helps - let me know if you've any questions or need anything else.

= 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?

It's a good practice to define marital_status_options(Business logic) inside model: -

Assuming that it's Employee model

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

Reason that it's not selecting your default marital_status is because if @employee.marital_status.try(:upcase) will not match any of the marital_status_options , it will show your prompt option, so check it carefully that if @employee.marital_status.try(:upcase) matches any of the given options of select tag's option.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM