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 %>