Принятый ответ хорошо, если он работает для вас в конкретной ситуации, но он не очень надежный. Это не СУХОЙ, потому что вы повторяете link_to
и атрибуты class
в связке других мест. Он разваливается, если вам нужно манипулировать результатом, например добавлением любой другой разметки. Например, вы хотите сделать элементы списка ссылок.
Если вы перерастаете, что он делает для вас, я мог бы предложить иметь ваши возвращаемые данные хелперов, что ваш шаблон затем использует:
def action_buttons(user)
case current_user.friendship_status(user) when "friends"
[
{
label: "Cancel Friendship",
path: friendship_path(current_user.friendship_relation(user)),
form_attributes: { method: :delete }
}
]
when "pending"
# likewise
when "requested"
[
{
label: "Accept",
path: accept_friendship_path(current_user.friendship_relation(user)),
form_attributes: { method: :put }
}, {
label: "Decline",
path: friendship_path(current_user.friendship_relation(user)),
form_attributes: { method: :delete }
}
]
when "not_friends"
# likewise
end
end
А потом в шаблоне, вы просто перебирать массивы и тянуть соответствующие атрибуты из хеша, который возвращается.
В качестве альтернативы, вы можете иметь ваш помощник взять блок, а затем выход к этому блоку:
def action_buttons(user)
case current_user.friendship_status(user) when "friends"
yield(link_to "Cancel Friendship", friendship_path(current_user.friendship_relation(user)), method: :delete, class: "btn btn-primary btn-xs")
when "pending"
yield(link_to "Cancel Request", friendship_path(current_user.friendship_relation(user)), method: :delete, class: "btn btn-primary btn-xs")
when "requested"
yield(link_to "Accept", accept_friendship_path(current_user.friendship_relation(user)), method: :put, class: "btn btn-primary btn-xs")
yield(link_to "Decline", friendship_path(current_user.friendship_relation(user)), method: :delete, class: "btn btn-default btn-xs")
when "not_friends"
yield(link_to "Add as Friend", friendships_path(user_id: user.id), method: :post, class: "btn btn-primary btn-xs")
end
end
Таким образом, шаблон просто обеспечивает работу, чтобы сделать для каждой ссылки в блоке. Этот блок может быть только { |link| link }
, если все, что вам нужно, это конкатенация, но вы также можете его обернуть в теги или что угодно. Я бы по-прежнему рекомендовал факторинг link_to
, чтобы он был менее повторяющимся.
Спасибо! Обманчиво простое решение. :) –