Что такое рубиновый эквивалент getattr для Python? - PullRequest
11 голосов
/ 24 апреля 2009

Я новичок в 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 из представления, вызывающего частичное средство визуализации.)

Ответы [ 4 ]

13 голосов
/ 24 апреля 2009

Эквивалентное утверждение в Ruby:

date_wanted = :created_on
title_date = list_titles.send(date_wanted)
4 голосов
/ 02 июля 2009

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

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

send позволяет динамически вызывать метод с произвольным именем объекта.

0 голосов
/ 25 апреля 2009

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

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

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

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

0 голосов
/ 24 апреля 2009

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

def get_date(date)
  return created_on if date == 'created'
  return updated_on
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...