It seems as though there is currently no way to enumerate required attributes in a model. This functionality could be quite nice for seeing which fields are mandatory in a form. Would this be of interest to anyone?
Here is a quick overview:
schema.rb
create_table “people”, :force => true do |t|
t.string “first_name”
t.string “last_name”
t.integer “age”
end
person.rb
class Person < ActiveRecord::Base
validates_presence_of :first_name, :last_name
end
Person.required_attributes
=> [:first_name, :last_name]
CSS Styles
.mandatory_field {
background-color: red;
}
.form_field {
background-color: grey;
}
people_helper.rb
module PeopleHelper
def css_class(field_name)
Person.required_attributes.include?(fieldname) ? 'mandatory_field' : 'form_field'
end
end
new / edit.html.erb
<%= form_for(@person) do |f| %>
<%= f.text_field :first_name %>
<% end %>
+1. Looks like a good way to eliminate the hassle of all those little red asteriks.
I’ve submitted a patch to Lighthouse on this subject:
http://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/750-patch-activerecord-required_attributes
Please show some +1 love if this is helpful to you!
Thanks!
Matt Darby**, M.S.**
Rails | PHP | Linux | MySQL | IT
Email: matt@matt-darby.com
Skype: matt-darby
Web: http://blog.matt-darby.com
Couldn't the same thing be accomplished by doing the following?
# person.rb
class Person < ActiveRecord::Base
REQUIRED_ATTRS = %w(first_name last_name)
validates_presence_of REQUIRED_ATTRS
end
# people_helper.rb
module PeopleHelper
def css_class(field_name)
Person::REQUIRED_ATTRS.include?(fieldname) ? 'mandatory_field' :
'form_field'
end
end
+1. Looks like a good way to eliminate the hassle of all those little red
asteriks.
I've submitted a patch to Lighthouse on this subject:
#750 Keeping track of validations with a hash - Ruby on Rails - rails
Please show some +1 love if this is helpful to you!
We also had a thread earlier from Ruy Asan (
http://groups.google.com/group/rubyonrails-core/browse_thread/thread/4cce3966cd61f278/dc000651f75a575a?lnk=gst
) about reimplementing the internals of the validation code to make
stuff like this *much* easier. I'm not sure if Ruy and Rick have
started investigating merging that stuff, but rather than patch in
this kind of behaviour it'd be nice to get it for 'free' when we make
a design improvement.
I made a patch that solves this problem in a more elegant and useful
way.
http://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/750-patch-activerecord-required_attributes
(2nd Patch)
Usage:
class Person < ActiveRecord::Base
validates_uniqueness_of :name
validates_presence_of :name, :city
end
Person.validations
=> {:uniqueness => [:name], :presence => [:name, :city]}
As far as the branches that are reworking validations- they seem to be
dead. I'd be all for helping out, if there's still an impetus behind
merging in the branches at some point in time.
I added some comments to Erik Peterson last patch on Lighthouse. It
would be nice if more people help with the discussion:
Wouldn't be nice with validations also store the options sent?
class Person < ActiveRecord::Base
validates_presence_of :name, :city
validates_length_of :name, :within => 3..20,
end
Person.validations
=> {:presence => { :name => {}, :city => {} }, :length => { :name =>
{ :within => 3..20 } }}
I think it would be even more readable if it is "attribute oriented":
Person.validations
=> {:name => { :presence => {}, :length => { :within =>
3..20 } }, :city => { :presence => {} }}
Why? This would DRY javascript code generation from our models
completely.
As far as the branches that are reworking validations- they seem to be
dead. I'd be all for helping out, if there's still an impetus behind
merging in the branches at some point in time.
Actually the main validations rework is happening in active_model [1]
with the hope that one day activerecord could make use of active_model,
perhaps also using active_relation [2] for the sql generation.
[1] GitHub - clarabstract/rails at active_model_validations
[2] git://github.com/nkallen/arel.git
I made a patch that solves this problem in a more elegant and useful
way.
#750 Keeping track of validations with a hash - Ruby on Rails - rails
(2nd Patch)
Usage:
class Person < ActiveRecord::Base
validates_uniqueness_of :name
validates_presence_of :name, :city
end
Person.validations
=> {:uniqueness => [:name], :presence => [:name, :city]}
This is nice, but I think it'd be good to do this with some classes
rather than hashes. Have a look at ruy asan's branch for some ideas
but something like having a set of Validation objects associated with
the model class would be nice. Then you can make the set itself
ducktype a little more like you've mentioned above.
Person.validations[:uniqueness] => [ValidationObjectForName]
Person.validations[:presence] => [ValidationObjectForName,
ValidationObjectForCity]
We can then, at a later date, move the callback chains to introspect
those validation instances rather than just generating code at
runtime.
As far as the branches that are reworking validations- they seem to be
dead. I'd be all for helping out, if there's still an impetus behind
merging in the branches at some point in time.
The branches in particular aren't that important, it's more important
that there are people thinking about the issues to fix. If the
initial authors have lost interest or don't have time, you should
either reinvigorate that branch or take the ideas / patches into your
own branch and get that ready for review 