Rails - collection_select выбранное значение, если определено?

У меня есть следующее:

<%= f.collection_select :role_id, roles, :id, :name, :prompt => true, :selected => 2 %>

Проблема в том, что мне нужно только выбранное значение 2, если значение @permission.role_id равно нулю.

поэтому я попробовал:

<%= f.collection_select :role_id, roles, :id, :name, :prompt => true, {:selected => 2 if @permission.role_id.nil?} %> 

но это сделало Rails сердитым. Как я могу сделать выбранное условие на основе, если отдельная переменная равна нулю или нет?

Спасибо

Ответы

Ответ 1

ok Думаю, я буду чувствовать себя глупо в течение 2 минут, но как насчет

<%= f.collection_select :role_id, roles, :id, :name, prompt: true, @permission.role_id ? {} : {selected: 2 } %>

Причина, по которой ваше решение не работает, заключается в том, что ваш if может возвращать nil, поэтому выглядит примерно так:

<%= f.collection_select :role_id, roles, :id, :name, :prompt => true, {nil} %>

Где {nil} является синтаксической ошибкой

Ответ 2

Пока принятое решение с тернарным оператором работает, я не думаю, что это вполне читаемо, как следующее решение:

<%= f.collection_select :role_id, roles, :id, :name, :prompt => true, :selected => @permission.role_id || 2 %>

Ответ 3

поместите это в свой помощник

def selected(permission)
  if permission.role_id.nil?
    return 2
  else
    .....
  end
end

и это на ваш взгляд

<%= f.collection_select :role_id, roles, :id, :name, :prompt => true, :selected => selected(@permission) %>

Ответ 4

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

<% if @permission.role_id.nil? %>
  <%= f.collection_select :role_id, roles, :id, :name, :prompt => true, {:selected => 2} %>
<% else %>
  <%= f.collection_select :role_id, roles, :id, :name, :prompt => true %>
<% end %>

Ответ 5

Я нашел, что @ecoologic ответ не работал у меня, поскольку ruby ​​попытался интерпретировать хэш как ключ для последнего аргумента вместо того, чтобы искать внутри хеша для значений.

Решение заключалось в использовании splat. Однако, похоже, что эти символы не работают в этом встроенном формате, поэтому я использовал следующее:

<% selected = @permission.role_id ? {} : {selected: 2 } %>
<%= f.collection_select :role_id, roles, :id, :name, prompt: true, **selected %>