Nil param值导致崩溃。如果我设置的值存在,我如何只创建一个参数?

时间:2014-08-07 20:33:38

标签: ruby-on-rails ruby ruby-on-rails-4 link-to

这是我的代码:

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

如您所见,我正在创建参数并使用图像的图像网址设置它们。然而,一个物体不会总是有6张图像。有些可能有2个可能有3个甚至可能只有1个图像。对nil属性的调用将导致我的应用程序崩溃。

我尝试在逗号之前的每行末尾添加if语句,但这不起作用。如何安全地检查对象图像是否存在,然后创建并设置它对应的参数值?

最初我尝试将整个对象作为参数传递但在我的其他控制器中遇到了问题。所以现在我想分别传递图片网址。

感谢您的时间

2 个答案:

答案 0 :(得分: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) %>

答案 1 :(得分:1)

您可以使用.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