代码之家  ›  专栏  ›  技术社区  ›  Hamish Downer JKP

python的getattr的ruby等价物是什么?

  •  11
  • Hamish Downer JKP  · 技术社区  · 16 年前

    我对Rails不太熟悉,尝试进行一点重构(将一个在app/views/shared中列出标题的部分渲染器放在一起),渲染器会显示日期和标题。但是渲染器的不同用户使用不同的日期。通过重构的一部分

    title_date = list_titles.created_on
    

    对于渲染器的其他用户,我希望

    title_date = list_titles.updated_on
    

    那么我可以使用我传递的字符串吗(使用:locals参数)?我知道我可以用巨蟒

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

    但我无法用Ruby来解决这个问题。(显然,在Rails中,我会从调用部分渲染器的视图中传递所需的日期字符串。)

    4 回复  |  直到 15 年前
        1
  •  13
  •   Matt Haley    16 年前

    Ruby中的等效语句:

    date_wanted = :created_on
    title_date = list_titles.send(date_wanted)
    
        2
  •  4
  •   Mark McEahern    15 年前

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

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

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

        3
  •  0
  •   Jason Miesionczek    16 年前

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

    def get_date(date)
      return created_on if date == 'created'
      return updated_on
    end
    
        4
  •  0
  •   nutcracker    16 年前

    马特的回答对你的确切问题是正确的,我理解你的处境可能有点离谱,但是…

    我将通过局部变量散列将整个用户对象传递到分部中。

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

    然后在部分调用helper方法以返回每个标题的正确日期,如下所示:

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

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

    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 )基于特定于给定用户的某些逻辑。

    这种方法隐藏了大部分逻辑,保持了视图的整洁。另外,它使以后添加特定于给定用户的其他功能变得简单。