I see. But it does feel like code smell to me. And, you can always do something like :
region = [params[:state], params[:country], 'US'].detect(&:present?) On Sun, Dec 27, 2009 at 10:28 PM, ColinDKelley <[email protected]> wrote: >> We already have Object#present? :) > > True, but present? is just the inverse of blank?. What we've found > very useful is to have a method that treats blank parameters the same > as missing ones, and allows chaining. > > Check out the example: > > state = params[:state] unless params[:state].blank? > country = params[:country] unless params[:country].blank? > region = state || country || 'US' > > Rewriting with present? isn't any more expressive: > > state = params[:state] if params[:state].present? > country = params[:country] if params[:country].present? > region = state || country || 'US' > > But nonblank? makes it more concise and expressive IMO: > > region = params[:state].nonblank? || params[:country].nonblank? || > 'US' > > We've been using it this way for the last year and it really has > cleaned up a lot of code. More importantly it has become a reflex to > use it inline--as shown above--that has helped us avoid bugs where we > might think a parameter was present but really it was just there with > an empty value. > > I suppose we could keep the method name present? but switch its > behavior to match what's proposed here for nonblank?. But that > contract change could break someone's code who was depending on a > boolean being returned. Also I prefer that nonblank? has a name that > parallels nonzero? from Ruby. > > I like the symmetrical pair of nonzero? and nonblank? because they map > values (0, empty/blank string respectively) to nil that are typically > equivalent to not being present at all. Other languages like Python > found it convenient to have 0 and empty string treated as false for > just this reason I think. > > -Colin > > > On Dec 27, 5:37 am, Pratik <[email protected]> wrote: >> We already have Object#present? :) >> >> >> >> >> >> On Sun, Dec 27, 2009 at 7:49 AM, ColinDKelley <[email protected]> wrote: >> > All, >> >> > I'd like to propose the Object#nonblank? in ActiveSupport, layered >> > over the blank? method. This has been working well for us in the past >> > year and hopefully others will find it useful enough to include in >> > core. >> >> > It is analogous to Ruby's Numeric#nonzero? method: it either returns >> > the object itself (if not blank) or nil (if blank). This makes it easy >> > to treat blank parameters the same as missing ones, and allows >> > chaining: >> >> > For example, this: >> >> > state = params[:state] unless params[:state].blank? >> > country = params[:country] unless params[:country].blank? >> > region = state || country || 'US' >> >> > becomes: >> >> > region = params[:state].nonblank? || params[:country].nonblank? || >> > 'US' >> >> > The ticket is here: >> >> >https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/3... >> >> > along with a patch that includes full documentation and tests. >> >> > -- >> >> > You received this message because you are subscribed to the Google Groups >> > "Ruby on Rails: Core" group. >> > To post to this group, send email to [email protected]. >> > To unsubscribe from this group, send email to >> > [email protected]. >> > For more options, visit this group >> > athttp://groups.google.com/group/rubyonrails-core?hl=en. >> >> -- >> Cheers! >> - Pratikhttp://m.onkey.org|http://twitter.com/lifo > > -- > > You received this message because you are subscribed to the Google Groups > "Ruby on Rails: Core" group. > To post to this group, send email to [email protected]. > To unsubscribe from this group, send email to > [email protected]. > For more options, visit this group at > http://groups.google.com/group/rubyonrails-core?hl=en. > > > -- Cheers! - Pratik http://m.onkey.org | http://twitter.com/lifo -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/rubyonrails-core?hl=en.
