11

我是 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)

但我不知道如何在红宝石中做到这一点。(显然,在 Rails 中,我会从调用部分渲染器的视图中传递 date_wanted 字符串。)

4

4 回答 4

14

Ruby 中的等效语句:

date_wanted = :created_on
title_date = list_titles.send(date_wanted)
于 2009-04-24T15:51:40.977 回答
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 允许您在对象上动态调用任意命名的方法。

于 2009-07-02T16:04:08.103 回答
0

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

def get_date(date)
  return created_on if date == 'created'
  return updated_on
end
于 2009-04-24T15:51:34.813 回答
0

马特的回答对于您的确切问题是正确的,我可能无法理解您的情况,但是......

我会通过本地哈希将整个用户对象传递给部分。

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

这种方法隐藏了大部分逻辑,并使您的视图保持整洁。此外,以后可以轻松添加特定于给定用户的更多功能。

于 2009-04-25T09:12:43.250 回答