如果图像不存在则显示默认用户图像(轨道上的红宝石)

时间:2015-08-14 05:16:08

标签: ruby-on-rails

我想在ruby中写一个条件,如果没有用户图像,则显示默认图像,如果存在则显示当前图像。

这是我的index.html.slim页面:

@product.reviews.each do |r|
  a href="#"
  = image_tag r.user.image_url :thumbnail`

3 个答案:

答案 0 :(得分:2)

我建议你在帮助器或模型中添加代码,以保持代码清洁。

辅助方法:

def user_avatar user
  if user.image.present?
    image_tag user.image_url :thumbnail
  else
    # Assuming you have a default.jpg in your assets folder
    image_tag 'default.jpg'
  end
end

查看页面:

@product.reviews.each do |r|
  a href="#"
    = user_avatar r.user

另外,从代码中我觉得你使用的是像paperclip或carrierwave这样的库。

如果在回形针中,您可以通过将此代码放入模型中来设置默认图像。

:default_url => "/assets/:style/missing_avatar.jpg"

如果您使用的是载波,请将此方法放在上传器文件中。

def default_url
  "/images/fallback/default.png"
end

答案 1 :(得分:1)

假设您使用回形针或其他东西将图像保存到数据库,您可以通过

检查图像是否存在
08-14 00:19:47.866  31836-31836/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.easypass.app.cliente, PID: 31836
java.lang.RuntimeException: Unable to create application com.easypass.app.cliente.Application: java.lang.NullPointerException: storage == null
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4463)
        at android.app.ActivityThread.access$1500(ActivityThread.java:146)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1274)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5280)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
        at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.NullPointerException: storage == null
        at java.util.Arrays$ArrayList.<init>(Arrays.java:38)
        at java.util.Arrays.asList(Arrays.java:155)
        at com.parse.ManifestInfo.hasRequestedPermissions(ManifestInfo.java:392)
        at com.parse.ManifestInfo.hasAnyGcmSpecificDeclaration(ManifestInfo.java:454)
        at com.parse.ManifestInfo.getPushType(ManifestInfo.java:201)
        at com.parse.GcmRegistrar.registerAsync(GcmRegistrar.java:86)
        at com.parse.Parse.initialize(Parse.java:230)
        at com.easypass.app.cliente.Application.onCreate(Application.java:19)
        at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1014)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4460)

你应该查看你的图片宝石,看看这是否有效,因为我不知道你有什么样的设置。

答案 2 :(得分:0)

我设法通过在用于显示用户的视图内部使用erb来解决此问题。

此方法的优点是您无需为多个用户多次保存默认照片。您可以将其中一个保存在资产/图像中,并仅依靠它。

我使用Active Storage和以下宝石来处理照片的上载和调整大小:

gem 'image_processing',           '1.9.3'
gem 'mini_magick',                '4.9.5'
gem 'active_storage_validations', '0.8.9'

并在必要的视图内编写了以下代码:

  <% if user.image.attached? %>
   <%= image_tag user.image.variant(resize_to_limit: [200, 200]) %>
  <% else %>
    <%= image_tag("default.jpg", alt: "A stern frog", width: "200") %>
  <% end %>

只需确保在资产/图片中有一张名为default.jpg的照片