Нулевое значение параметра вызывает сбой. Как создать параметр, только если значение, с которым я его устанавливаю, существует?

Вот мой код:

 <% @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
Другие вопросы по тегам