我是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字符串。)
答案 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_on
或updated_on
)。
这种方法可以消除大部分逻辑并使您的视图保持干净整洁。此外,它还可以在以后添加特定于给定用户的更多功能。