How to change a text field's contents to all uppercase letter

Hi,

I'm relatively new to RoR so pardon if this is a really stupid question. I have a text field where people will be entering a username. I need to figure out a way to either

1. validate the field so that it will not be accepted unless they've entered all uppercase letters for their username -- less ideal 2. regardless of what they enter in the field (uppercase or lowercase) I need to convert the username value to uppercase before it's stored in the database.

Here is my form:

<% form_for(@post) do |f| %>   <%= f.error_messages %>

  <fieldset>   <legend>Enter Details</legend>

  <div>     <%= f.label :username,'Enter your username:' %>     <%= f.text_field :username, :size => 40 %>   </div>

  <div>     <%= f.submit "Save", :class => "submit" %>   </div>

  </fieldset>

<% end %>

Thanks so much for any assistance! I greatly appreciate any help.

  1. regardless of what they enter in the field (uppercase or lowercase)

I need to convert the username value to uppercase before it’s stored

Try this:

class Post < ActiveRecord::Base

def before_save

self.username.downcase!

end

end

Cheers,

Andy

did you mean:

self.username.upcase ?? .... I need to make sure the username is uppercase, not lowercase.

Thanks so much for the quick reply!

erm... upcase! :wink:

Or change the setter (rather than messing around with filters :wink:

def username=(value)   write_attribute(:username, value.upcase) end

  1. regardless of what they enter in the field (uppercase or lowercase)

I need to convert the username value to uppercase before it’s stored

self.username.downcase!

erm… upcase! :wink:

Doh :slight_smile:

Or change the setter (rather than messing around with filters :wink:

def username=(value)

write_attribute(:username, value.upcase)

end

Is the setter called if you assign to the attributes hash (e.g. with new or create)?

I guess it must be, but I’d generally put that in a callback to be sure :slight_smile:

Cheers,

Andy

I'd be putting this:

def username=(value)   write_attribute(:username, value.upcase) end

in my controller right? Sorry for the beginning questions...

Or change the setter (rather than messing around with filters :wink:

def username=(value) write_attribute(:username, value.upcase) end

Is the setter called if you assign to the attributes hash (e.g. with new or create)? I guess it must be, but I'd generally put that in a callback to be sure :slight_smile: Cheers,

ooo.... good question - don't know without testing it...

User.new(:username => "fred")

=> #<User id: nil, role_detail_id: nil, title: "FRED", first_name: nil, last_name: nil>

yup, looks that way.

But more to the point, I don't like changing users' input before storing it in the DB. We've shown how you *can* do it, and you've said you *need* to, but I'd wonder whether that's really a *want* to... either way... it works either way.

nope - in the User model.

Worked perfectly...thanks so much!

Hey, you don't happen to know of a simple way of implementing a date picker for a field in a form do you? I was hoping to accomplish this without needing to track down a plugin for the task.

On a related note: how can I set the default value of a field to be today's date (just the date, no time value)

Thanks for all the help!

Hey, you don't happen to know of a simple way of implementing a date picker for a field in a form do you? I was hoping to accomplish this without needing to track down a plugin for the task.

I've used the "calendar_date_select" plugin in the past - it is a plugin, but it's also very simple.

On a related note: how can I set the default value of a field to be today's date (just the date, no time value)

Again in the model (one of several ways to address the need) :

def after_initialize   my_date_field = Date.today end

Sorry - that's bad - it will always reset the value to today even if there is an existing value...

This will just set it if the "my_date_field" value is nil:

my_date_field ||= Date.today

When I add this to my model:

  def after_initialize     :date = Date.today   end

I get this error -- /home/xxdesmus/timetool/app/models/post.rb:38: syntax error, unexpected '=', expecting kEND :date = Date.today ^

when I try it this way:

  def after_initialize     date = Date.today   end

It doesn't do anything ...probably because my field should have a different name other than "date" huh?

When I add this to my model:

def after_initialize

:date = Date.today

end

I get this error – /home/xxdesmus/timetool/app/models/post.rb:38:

syntax error, unexpected ‘=’, expecting kEND :date = Date.today ^

You will do, you’re trying to assign a value to a symbol (which is an immutable object).

when I try it this way:

def after_initialize

date = Date.today

end

It doesn’t do anything …probably because my field should have a

different name other than “date” huh?

def after_initialize self.date = Date.today end

Doing:

date =

Will just assign the value to a local variable.

Cheers,

Andy

+1 pesky local variables...

As an aside, using "date" as a name for a db field might cause you confusion down the line - it can be a reserved word (depending on the db). I'd try to give the some more name context: "registration_date" or whatever.

Got it working with:

  def after_initialize     self.date ||= Date.today   end

...hopefully I won't be pressing my luck, but one last question (for now). So I have a bunch of form fields that I need to add up their values, and make sure their sum does not except the value entered in a new form field. If the sum does exceed the form field value then I want to alert the user and prevent it from saving. Basically I want to validate that :atWorkHours.value > ( :hoursMeetings.value + :hoursTraining.value + :hoursProjTrav.value )

I tried to do something similar to this in my model...but I assume I just had the syntax completely wrong.

Last question/request for the day I promise!

Thanks, Justin :slight_smile:

Assuming all of the "hours" attributes all return numbers (something, somewhere is ensuring that, I hope :wink: -- you can add some validations to your model. Again, there's a couple of ways of doing this - I normally separate the method that adds the error to base from the code that checks the condition (so I can check the condition myself if I want), but you could easily merge them together if you prefer:

  validate :validate_work_hours_not_exceeded

  def work_hours_exceeded?     # this is a little different to your equation, as yours would raise an error if both sides were exactly the same, and I'd guess that's not the right result - but if not, adjust it to suit     [hours_at_meetings, hours_in_training, hours_travelling].sum > hours_at_work   end

  private   def validate_work_hours_not_exceeded     errors.add_to_base("Do not exceed working hours") if work_hours_exceeded?   end

I took the liberty of tweaking the variable names (although you were showing them as symbols...) to make them a little more in line with conventions (and, I think, more easily readable - YMMV :slight_smile:

Thank you so much for all your help!

Not having any luck with Calendar Date Select so far ... got it installed, but it looks like the documentation is out of date @ http://www.railslodge.com/plugins/46-calendar-date-select ...I can't for the life of me get the pop-up or embedded calendar to display ...let alone get either to display in a form to take a value.

Hey, you don't happen to know of a simple way of implementing a date picker for a field in a form do you? I was hoping to accomplish this without needing to track down a plugin for the task.

On a related note: how can I set the default value of a field to be today's date (just the date, no time value)

Did you try date_select? <%=f.date_select :name_of_field %> It defaults to today date if the field is of type date It is not too fancy, but it works...