什么是python的getattr的ruby等价物

我是rails的新手,并试图进行一些重构(放置一个部分渲染器,列出app / views / shared中的标题)渲染器显示日期和标题。 但是,渲染器的不同用户使用不同的日期。 通过重构的一部分我有

title_date = list_titles.created_on 

对于我想要的渲染器的其他用户

 title_date = list_titles.updated_on 

那么我可以使用我传递的字符串(使用:locals参数)吗? 我知道在Python中我能做到

 date_wanted = 'created_on' title_date = getattr(list_titles, date_wanted) 

但我无法弄清楚如何在ruby中做到这一点。 (显然在rails中我会从调用部分渲染器的视图中传递date_wanted字符串。)

Ruby中的等价语句:

 date_wanted = :created_on title_date = list_titles.send(date_wanted) 

我认为原始问题的答案是发送:

 irb(main):009:0> t = Time.new => Thu Jul 02 11:03:04 -0500 2009 irb(main):010:0> t.send('year') => 2009 

send允许您动态调用对象上任意命名的方法。

您可以像这样向模型添加一个函数

 def get_date(date) return created_on if date == 'created' return updated_on end 

马特的答案对你的确切问题是正确的,我可能会因为理解你的情况而感到茫然,但……

我将通过locals哈希将整个用户对象传递给partial。

 render( :partial => "shared/titles", :object => @titles, :locals => { :user => @user } ) 

然后在部分调用内部使用辅助方法返回每个标题的正确日期,例如:

 

<%= title_date_for_user(title, user) %>

将用户和每个标题对象传递给辅助方法。

 def title_date_for_user(title, user) case user.date_i_like_to_see when "created_on" title_date = title.created_on when "updated_on" title_date = title.updated_on end return title_date.to_s(:short) end 

date_i_like_to_see方法驻留在User模型中,并根据给定用户特定的某些逻辑返回一个字符串( created_onupdated_on )。

这种方法可以消除大部分逻辑,使您的视图保持良好和干净。 此外,它还可以在以后添加特定于给定用户的其他function。