Подтвердить что ты не робот

Что такое рубиновый эквивалент python getattr

Я новичок в рельсах и стараюсь сделать небольшой рефакторинг (помещая частичный рендерер, который перечисляет названия в приложении/представлениях/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 через представление, вызывающее частичный рендеринг.)

4b9b3361

Ответ 1

Эквивалентная инструкция в Ruby:

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

Ответ 2

Я думаю, что ответ на исходный вопрос отправлен:

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

Вы можете добавить функцию к модели, подобную этой

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

Ответ 4

Ответ Matt правильный для вашего точного вопроса, и я, возможно, не согласен с пониманием вашей ситуации, но...

Я передал бы весь пользовательский объект в частичное через хэш-код locals.

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 находится в модели пользователя и возвращает строку (created_on или updated_on) на основе некоторой логики, специфичной для данного пользователя.

Этот подход отталкивает большую часть логики и сохраняет ваше представление красивым и чистым. Кроме того, это упрощает добавление дополнительных функций, характерных для данного пользователя позже.