如果nil值,每个Rails都会跳过

时间:2016-12-28 05:46:34

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

我正在迭代一个数组列表,引用连接记录中的数据(学生):

index.html.erb

<% @activities.compact.each do |activity| %>
    <div class="img" style="background-image: url(<%= activity.student.image.url(:thumb) %>)">
<% end %>

如果由于某种原因用户删除了已连接的记录(学生),Rails会抛出此错误:

NoMethodError in Activities#index
undefined method `image' for nil:NilClass

有没有办法告诉Rails仍然呈现页面,但是如果不存在那么将sub作为该记录的默认值?

3 个答案:

答案 0 :(得分:3)

当然!例如,

activity.student.try{|s| s.image.url(:thumb)} || image_path("default.png")

你可能想把它放到帮助器中,因为它似乎开始变得复杂。

此外,如果用户控制附件URL的任何部分(例如,如果您使用其上传文件的文件名),我会对此处的XSS问题保持警惕。我不确定erb在输出属性时是否做对了。也许它确实 - 我只是不确定。

答案 1 :(得分:0)

如果您使用carrierwave gem进行上传,则可以使用内置的默认图片解决方案https://github.com/carrierwaveuploader/carrierwave#providing-a-default-url

答案 2 :(得分:0)

尝试

<% @activities.compact.each do |activity| %>
    <% if activity.student.present? %>
    <div class="img" style="background-image: url(<%= activity.student.image.url(:thumb) %>)">
    <% end %>
<% end %>