Нулевое значение параметра вызывает сбой. Как создать параметр, только если значение, с которым я его устанавливаю, существует?
Вот мой код:
<% @garments.each do |garment| %>
<tr>
<td>
<div>
<%= link_to "Edit", edit_adminpanel_path(
:id => garment["objectId"],
:image => garment["image"].url,
:image2 => garment["image2"].url,
:image3 => garment["image3"].url,
:image4 => garment["image4"].url,
:image5 => garment["image5"].url,
:image6 => garment["image6"].url)
%>
</div>
Как вы видите, я создаю параметры и устанавливаю их с помощью URL-адреса изображений. Однако объект не всегда имеет 6 изображений. У некоторых может быть 2, у некоторых может быть 3, у некоторых даже может быть только 1 изображение. При вызове свойств nil произойдет сбой моего приложения.
Я пытался добавить операторы if в конце каждой строки перед запятой, но это не сработало. Как я могу безопасно проверить, существует ли изображение объекта, и только затем создать и установить соответствующее значение параметра?
Первоначально я пытался передать весь объект в качестве параметра, но столкнулся с проблемами в моем другом контроллере. Так что сейчас я бы хотел передать URL изображения отдельно.
Спасибо за ваше время
2 ответа
Вы можете построить его динамически, добавив только существующие значения:
<% path_params = %w(image image2 image3 image4 image5 image6).each_with_object(:id => garment["objectId"]) do |name, hash|
hash[name.to_sym] = garment[name].url if garment[name]
end %>
<%= link_to "Edit", edit_adminpanel_path(path_params) %>
Вы можете использовать .try
метод:
<%= link_to "Edit", edit_adminpanel_path(
:id => garment["objectId"],
:image => garment["image"].try(:url),
:image2 => garment["image2"].try(:url),
:image3 => garment["image3"].try(:url),
:image4 => garment["image4"].try(:url),
:image5 => garment["image5"].try(:url),
:image6 => garment["image6"].try(:url))
%>
это .try
Метод очень полезен:
nil.try(:whatever) # => nil (does not raise NoMethodError)
Hash.new[:whatever].try(:url) # => nil