boolean? Emit "Yes" or "No", not "true" or "false"

Hi,

I have a silly question. I have a form that is filled out that has a
number of boolean values in it, represented by checkboxes. After the
request is posted, I am generating an e-mail to send to the person
handling the request.

In my mailer view (send_request.text.plain.rhtml), I do something like

Important thing one..: <%= @req.important_thing_1 %>
Important thing two..: <%= @req.important_thing_2 %>
Important thing three: <%= @req.important_thing_3 %>

Which is rendered as

Important thing one..: false
Important thing two..: true
Important thing three: false

I would like false to display as 'No' and true to display as 'Yes'. Is
there a knob or switch somewhere in rails to configure how boolean
values are converted into strings?

Thank you.

Regards,

Rich

I have a silly question. I have a form that is filled out that has a
number of boolean values in it, represented by checkboxes. After the
request is posted, I am generating an e-mail to send to the person
handling the request.

In my mailer view (send_request.text.plain.rhtml), I do something like

Important thing one..: <%= @req.important_thing_1 %>
Important thing two..: <%= @req.important_thing_2 %>
Important thing three: <%= @req.important_thing_3 %>

Which is rendered as

Important thing one..: false
Important thing two..: true
Important thing three: false

I would like false to display as 'No' and true to display as 'Yes'. Is
there a knob or switch somewhere in rails to configure how boolean
values are converted into strings?

I don't know if there is, but you could do something like this (and get
it loaded via environment.rb):

class TrueClass
   def to_yesno
     'Yes'
    end
end

class FalseClass
   def to_yesno
     'No'
    end
end

And then in your views do:

Important thing one..: <%= @req.important_thing_1.to_yesno %>
Important thing two..: <%= @req.important_thing_2.to_yesno %>
Important thing three: <%= @req.important_thing_3.to_yesno %>

try the ternary operator:

bool ? 'Yes' : 'No'

that will produce 'Yes' for true and 'No' for false; if you want an
empty string for nil, try:

(bool ? 'Yes' : 'No') unless bool.nil?

that will return nil if bool is nil, which will turn into an empty
string in an erb template (since nil.to_s is '').

Of course, you could wrap that in a helper if you really want to, or
add custom methods to TrueClass, FalseClass and NilClass... but
personally, I find it clean/dry enough just to use the operator.

Cheers,
Ken

try the ternary operator:

bool ? 'Yes' : 'No'

that will produce 'Yes' for true and 'No' for false; if you
want an empty string for nil, try:

(bool ? 'Yes' : 'No') unless bool.nil?

that will return nil if bool is nil, which will turn into an
empty string in an erb template (since nil.to_s is '').

Of course, you could wrap that in a helper if you really want
to, or add custom methods to TrueClass, FalseClass and
NilClass... but personally, I find it clean/dry enough just
to use the operator.

Hello,

Thanks, that works fine. I normally avoid the ternary operator, but in
this case, it's a very straight forward replacement so I've chosen this
route.

Thanks to everyone who took the time to reply.

Regards,
Rich

Just because I was curious:

class TrueClass
  def to_s
    "Yes"
  end
end

class FalseClass
  def to_s
    "No"
  end
end

true.to_s => "Yes"
false.to_s => "No"

But this would mean *anywhere* you print out a boolean value it would
render "Yes" or "No".

-Shawn

Woops, didn't realize that someone answered this already!

Ignore me :slight_smile:

-Shawn

Found via google. I made a quick script for this. Sorry for reviving..

class TrueClass
  def to_s(style = :boolean)
    case style
      when :word then 'yes'
      when :Word then 'Yes'
      when :number then '1'
      else 'true'
    end
  end
end

class FalseClass
  def to_s(style = :boolean)
    case style
      when :word then 'no'
      when :Word then 'No'
      when :number then '0'
      else 'false'
    end
  end
end

https://gist.github.com/pehrlich/4963672