Sometimes in a view I have written wretchedly, ugly code like this: <%= @person.company.address.city if @person and @person.company and @person.company.address and @person.company.address.city %> I''m calling this a chained value. These values can run deep whether they are the part of an ActiveRecord association (e.g. a child record) or a simple composite field (e.g. address_city and address_state become address.city and address.state). In any case, we have to make sure everything exists before we try to display a deeply chained value. Otherwise, our app barfs. Before I go reinventing the wheel, I am wondering how others may have handled this, perhaps with a generic helper method. I am considering writing one. I would want it to be pretty to look at, maybe something along these lines: <%= chained_value @person.company.address.city %> Trouble is, I don''t think this will work because I am guessing it will attempt to resolve the value it intends on passing. I could describe the chain and handle it with an eval, I guess, but it looks less pretty: <%= chained_value "@person.company.address.city" %> The method definition might look something like this: def chained_value(value_chain, no_value = "", error_value = "N/A") It has a value it displays when the last item in the chain is blank, and one it displays if it chokes while trying to work it''s way down the chain. Your thoughts? Mario T. Lanza -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Hi, Mario T. Lanza wrote:> Sometimes in a view I have written wretchedly, ugly code like this: > > <%= @person.company.address.city if @person and @person.company and > @person.company.address and @person.company.address.city %> >you can try <%= @person.company.address.city rescue nil %> That way, if everything''s fine you get the value or else you get nothing. regards, javier ramÃrez --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Thanks, Javier! I knew there had to be a better way. I did, however, go ahead and solve the problem with this: def chained_value(no_value = "", error_value = "N/A") begin value = yield value.blank? ? no_value : value rescue error_value end end alias :cv :chained_value This allows for one extra thing: a substitute value to use when blank. <%= cv("No City", "No Company Address"){@person.company.address.city} %> Plus it''s just as concise: <%= @person.company.address.city rescue nil %> <%= cv{@person.company.address.city} %> -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Alternately: def chained_value(no_value = "", error_value = "N/A") yield || no_value rescue error_value end Contrast <%= cv("No City", "No Company Address"){@person.company.address.city} %> with <% @person.company.address.city || "No City" rescue "No Company Address" %> Just experimenting with the syntax. -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---