【问题标题】:What is the ruby equivalent of python's getattrpython的getattr的红宝石等价物是什么
【发布时间】:2010-10-21 15:31:49
【问题描述】:

我是 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-on-rails ruby language-comparisons


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    Ruby 中的等价语句:

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

    【讨论】:

      【解决方案3】:

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

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

      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_onupdated_on)。

      这种方法隐藏了大部分逻辑,让您的视图保持美观和整洁。此外,它还使得以后添加特定于给定用户的更多功能变得简单。

      【讨论】:

        【解决方案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 允许您在对象上动态调用任意命名的方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-17
          • 1970-01-01
          • 2019-06-22
          • 2017-08-11
          • 1970-01-01
          相关资源
          最近更新 更多