Ответ 1
Эквивалентная инструкция в Ruby:
date_wanted = :created_on
title_date = list_titles.send(date_wanted)
Я новичок в рельсах и стараюсь сделать небольшой рефакторинг (помещая частичный рендерер, который перечисляет названия в приложении/представлениях/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 через представление, вызывающее частичный рендеринг.)
Эквивалентная инструкция в Ruby:
date_wanted = :created_on
title_date = list_titles.send(date_wanted)
Я думаю, что ответ на исходный вопрос отправлен:
irb(main):009:0> t = Time.new
=> Thu Jul 02 11:03:04 -0500 2009
irb(main):010:0> t.send('year')
=> 2009
send позволяет динамически вызывать метод с произвольным именем объекта.
Вы можете добавить функцию к модели, подобную этой
def get_date(date)
return created_on if date == 'created'
return updated_on
end
Ответ 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
) на основе некоторой логики, специфичной для данного пользователя.
Этот подход отталкивает большую часть логики и сохраняет ваше представление красивым и чистым. Кроме того, это упрощает добавление дополнительных функций, характерных для данного пользователя позже.