11

私はレールに不慣れで、少しリファクタリングしようとしています ( 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)

しかし、ルビーでそれを行う方法がわかりません。(明らかにレールでは、部分レンダラーを呼び出すビューから 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

マットの答えはあなたの正確な質問に対して正しいです。私はあなたの状況を理解するのにかなり外れているかもしれませんが...

ローカル ハッシュを介してユーザー オブジェクト全体をパーシャルに渡します。

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 に答える
0

このようなモデルに関数を追加できます

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