2015-04-19 4 views
2

У меня есть помощник рельсов, где у меня есть два link_to. Если статус дружбы - requested. Он отображает только вторую ссылку. Как мне отформатировать это так, чтобы отображались обе ссылки?Как вернуть несколько значений из вспомогательного метода Rails

def action_buttons(user) 
    case current_user.friendship_status(user) when "friends" 
     link_to "Cancel Friendship", friendship_path(current_user.friendship_relation(user)), method: :delete, class: "btn btn-primary btn-xs" 
    when "pending" 
     link_to "Cancel Request", friendship_path(current_user.friendship_relation(user)), method: :delete, class: "btn btn-primary btn-xs" 
    when "requested" 
     link_to "Accept", accept_friendship_path(current_user.friendship_relation(user)), method: :put, class: "btn btn-primary btn-xs" 
     link_to "Decline", friendship_path(current_user.friendship_relation(user)), method: :delete, class: "btn btn-default btn-xs" 
    when "not_friends" 
     link_to "Add as Friend", friendships_path(user_id: user.id), method: :post, class: "btn btn-primary btn-xs" 
    end 
end 

ответ

2

Объединить строки. Возвращаемое значение блока будет последней возвращаемой строкой; вы должны конкатенировать возвращаемые значения двух вызовов link_to.

def action_buttons(user) 
    case current_user.friendship_status(user) 
    # ... 
    when "requested" 
     link_to("Accept", ...) + 
     link_to("Decline", ...) 
     # ... 
    end 
    end 
+0

Спасибо! Обманчиво простое решение. :) –

1

Принятый ответ хорошо, если он работает для вас в конкретной ситуации, но он не очень надежный. Это не СУХОЙ, потому что вы повторяете 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, чтобы он был менее повторяющимся.

+0

Благодарим вас за ввод. Я добавил это в закладки для будущего использования. :) –

Смежные вопросы