I Think a validation will only work after data is entered. With authorization (as in CanCan) the possibility of creating a new proposal can be avoided all together.
I did some experiments but yes, it's possible to put extra arguments into the initialize method.
For instance, initialize(user, project_proposal=nil).
In case you want to check you could use
ability=Ability.new(user,project_proposal)
ability.can? :create, :proposal
should give you a true or false based on what project_proposal was entered.
Ace