I happen to implemented a gem for this, and only now realized someone having the same issue as me.
Repo: https://github.com/lulalala/adequate_errors Blog post: http://lulalala.logdown.com/posts/2909828-adequate-errors Would it be possible to take some of these to Rails 6 (with the intention to break compatibility?) Rafael Mendonça França於 2016年2月29日星期一 UTC+8下午11時58分01秒寫道: > > I'm positive for this enhancement. The type information is already > retained in Rails 5 but having real object could be real handy. > > On Mon, Feb 29, 2016 at 12:47 PM Evan Prothro <evan.p...@gmail.com > <javascript:>> wrote: > >> I love the concept and usability of an ActiveModel::Errors paradigm. >> However, I and others often find it frustrating to work with the >> implementation. >> >> >> I'd love to see a proper ActiveModel::Error object, where the errors >> attribute of a model including ActiveModel::Errors was an Enumerator of >> these objects. >> >> >> There are various implied benefits and added flexibility that could be >> introduced in a backwards compatible way later, and immedate benefits. >> Would love to know what y'all think about this. Happy to implement if >> desired. >> >> >> <https://gist.github.com/eprothro/5ea12fd2b0527baf0090#immediate-benefits>Immediate >> >> Benefits >> >> >> <https://gist.github.com/eprothro/5ea12fd2b0527baf0090#the-error-type-could-be-retained>The >> >> error type could be retained >> >> APIs we build prefer to return Error objects to clients with the >> following schema: >> >> { >> attribute: "The model attribute to which the error applies. If blank, the >> error applies generically to the base model.", >> type: "The type of error encountered with the model attribute or >> model." >> messsage: "An internationalized message that can be displayed to a >> user.", >> } >> >> In particular, the type attribute allows clients to couple any logic >> they need on the error attribute and type, not themessage, which should >> be able to change with business/product needs. >> >> With a proper ActiveModel::Error object, this is easily done. With the >> current enumerable design, this is not a clean extension to make >> <https://gist.github.com/eprothro/d58d143729987c6c8834>. >> >> >> <https://gist.github.com/eprothro/5ea12fd2b0527baf0090#the-error-message-can-be-lazily-looked-up>The >> >> error message can be lazily looked up >> >> Currently, the message interpolation is looked up when the error is added >> to the model. This isn't necessarry, and is easily lazily evaluated when a >> derived attribute on an Error object. >> >> >> >> <https://gist.github.com/eprothro/5ea12fd2b0527baf0090#other-enhancements-easily-enabled>Other >> >> Enhancements easily enabled >> >> >> <https://gist.github.com/eprothro/5ea12fd2b0527baf0090#accessing-the-attribute-value-more-cleanly>Accessing >> >> the attribute value more cleanly >> >> error = model.errors.first >> error.attribute >> => :username >> error.attribute_value >> => 'eprothro' >> >> >> >> <https://gist.github.com/eprothro/5ea12fd2b0527baf0090#easier-custom-interpolation-parameters>Easier >> >> custom interpolation parameters >> >> # en.yml >> errors: >> models: >> user: >> attributes: >> username: >> taken: "%{value} has already been taken." >> >> -- >> You received this message because you are subscribed to the Google Groups >> "Ruby on Rails: Core" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to rubyonrails-co...@googlegroups.com <javascript:>. >> To post to this group, send email to rubyonra...@googlegroups.com >> <javascript:>. >> Visit this group at https://groups.google.com/group/rubyonrails-core. >> For more options, visit https://groups.google.com/d/optout. >> > -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group. To unsubscribe from this group and stop receiving emails from it, send an email to rubyonrails-core+unsubscr...@googlegroups.com. To post to this group, send email to rubyonrails-core@googlegroups.com. Visit this group at https://groups.google.com/group/rubyonrails-core. For more options, visit https://groups.google.com/d/optout.