2009-04-24 23 views
10

私はレールには新しく、少しリファクタリングを試みています(app/views/sharedにタイトルをリストする部分レンダラーを置く)。レンダラーはタイトルを日付とともに表示します。ただし、レンダラーのユーザーによって異なる日付が使用されます。私はレンダラの他のユーザーのためにpythonのgetattrに相当するものは何ですか

title_date = list_titles.created_on 

を持ってリファクタリングの途中には、私は

title_date = list_titles.updated_on 

は、だから私は、私は(:地元のパラメータを使用して)を通過した文字列を使用することができるのでしょうか?私はPythonで私ができることを知っている

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

しかし、私はそれを行う方法をルビーで行うことはできません。 (もちろんレールに私は、部分的なレンダラを呼び出すビューから通じdate_wanted文字列を渡します。)

答えて

11

同等の文のようにモデルに機能を追加することができます。

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

あなたはRubyでこの

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

マットの答えはあなたの正確な質問に対して正しいと私は、私は全体のユーザオブジェクトを渡したいあなたの状況けど...

を理解するとの双方向のオフマークであるかもしれない私地元のハッシュを介して部分的にユーザーとヘルパーメソッドに、各タイトルのオブジェクトを渡し

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

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

はその後、部分内、各タイトルのようなものを正しい日付を返すために、ヘルパーメソッドを呼び出します。

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)を返します。

このアプローチはロジックのほとんどを取り除き、あなたのビューをすばらしく清潔に保ちます。さらに、後で特定のユーザーに特有の機能を追加するのが簡単になります。

3

私は元の質問への答えが送信されると思う:

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

をsendはあなたが動的オブジェクトに対する任意の名前のメソッドを呼び出すことができます。

関連する問題