Putting the errors in the right place
Simple… first go into your view and delete the
error_messages_for ‘object’
Then stick this in your application helper.
# application_helper.rb
def error_for(object, method = nil, options={})
if method
err = instance_variable_get("@#{object}").errors.on(method).to_sentence rescue instance_variable_get("@#{object}").errors.on(method)
else
err = @errors["#{object}"] rescue nil
end
options.merge!(:class=>’fieldWithErrors’,
:id=>"#{[object,method].compact.join(’_')}-error",
:style=>(err ? #{options[:style]}":"#{options[:style]};display: none;")
)
content_tag("p",err || "", options )
end
Then in your form view, add an ‘error_for’ call wherever you need one…
# _form.rhtml <p><label for="code_project_name">Name</label> <%= text_field ‘code_project’, ‘name’ %> <%= error_for ‘code_project’, ‘name’ %></p>
If the model fails a validation test, then it will show the message right next to the field that caused the validation problem.
Also note that if you define an instance variable called @errors containing a hash of field_names and messages, they will also be used. This is handy for those form fields that don’t correspond to a model attribute.