什么是python的getattr的ruby等价物

时间:2009-04-24 15:44:47

标签: ruby-on-rails 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字符串。)

4 个答案:

答案 0 :(得分:13)

Ruby中的等效语句:

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

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:0)

您可以像这样添加一个功能

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

答案 3 :(得分:0)

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

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

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

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

<p><%= title_date_for_user(title, user) %></p>

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

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方法驻留在用户模型中,并根据给定用户特定的某些逻辑返回字符串(created_onupdated_on)。

这种方法可以消除大部分逻辑并使您的视图保持干净整洁。此外,它还可以在以后添加特定于给定用户的更多功能。