【问题标题】:How do i display uploaded images at different locations in ruby on rails?如何在 ruby​​ on rails 的不同位置显示上传的图像?
【发布时间】:2020-05-14 13:39:28
【问题描述】:

首先,我是 RoR 的新手,还在学习。

我想知道如何在不同位置显示单个用户上传的不同图像。

例如:如果用户上传了房子的不同图像(外部、内部、顶视图等),我想在网格中显示它们。

目前这就是我所拥有的;

<div class="gallerygrid">
  <div class="gd1 zoom"> 
    <%= image_tag @house.cover_photo(500, 550) %>
  </div>
  <div class="gd2 zoom"> 
    <%= image_tag @house.cover_photo(500, 550) %>
  </div>
  <div class="gd3 zoom"> 
    <%= image_tag @house.cover_photo(500, 550) %>
  </div>
  <div class="gd4 zoom"> 
    <%= image_tag @house.cover_photo(500, 550) %>
  </div>
</div>

我的 CSS

.gallerygrid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  grid-auto-rows: 200px;
  grid-gap: 1px;
  grid-auto-flow: dense;
    }

    .gallerygrid img {
    width: 100%;
    height: 100%;
    }

    .gd1 { grid-area: 1 / 1 / 3 / 3; }
    .gd2 { grid-area: 1 / 3 / 2 / 5; }
    .gd3 { grid-area: 2 / 3 / 3 / 4; }
    .gd4 { grid-area: 2 / 4 / 3 / 5; }

/*.img {
    max-width: 100%;
}*/

根据上面的代码,这就是它的显示方式。如您所见,它只是在所有 4 个网格中显示的相同图像,而不是在每个网格中显示不同的图像。

这是我的方法

def cover_photo(size_x, size_y)
  if self.photos.length > 0
    self.photos[0].variant(resize_to_limit: [size_x, size_y]).processed
  else
    "blank.jpg"
  end
end

更新: 所以按照@Daniel 的回答,我将方法移到了这样的助手中

module HouseHelper
  def cover_photo(photo, size_x, size_y)
    photo.variant(resize_to_limit: [size_x, size_y]).processed
  end
end

然后用这个代替

<div class="gallerygrid">
  <% @house.photos.each_with_index do |photo, index| %>
    <div class="gd1{index} zoom"> 
      <%= image_tag cover_photo(photo, 500, 550) %>
    </div>
    <div class="gd2{index} zoom"> 
      <%= image_tag cover_photo(photo, 500, 550) %>
    </div>
    <div class="gd3{index} zoom"> 
      <%= image_tag cover_photo(photo, 500, 550) %>
    </div>
    <div class="gd4{index} zoom"> 
      <%= image_tag cover_photo(photo, 500, 550) %>
    </div>
  <% end %>
</div>

现在所有的图像看起来都是一团糟,而不是我的 4 网格布局,

我该如何解决这个问题?

【问题讨论】:

    标签: ruby-on-rails imagemagick rails-activestorage minimagick


    【解决方案1】:

    您应该迭代您的照片,否则您每次都会渲染同一张照片。所以这样的事情就可以解决问题。

    <div class="gallerygrid">
      <% @house.photos.each_with_index do |photo, index| %>
        <div class="gd#{index+1} zoom"> 
          <%= image_tag cover_photo(photo, 500, 550) %>
        </div>
      <% end %>
    </div>
    

    然后将您的 cover_photo 方法移动到帮助程序中。

    def cover_photo(photo, size_x, size_y)
      photo.variant(resize_to_limit: [size_x, size_y]).processed
    end
    

    关于blank.jpg图片,我不确定你想做什么,但我认为用空白图片填充网格没有多大意义。

    【讨论】:

    • 我到底是怎么做这个迭代的?
    • 迭代是通过each_with_index 方法完成的,您将在photo 变量上获得每张照片的实例。
    • 在哪里可以添加助手?我的助手文件夹中已经有house_helper.rb。我应该在其中添加 in 方法还是创建新方法?
    • 另外,您能解释一下为什么将 {index} 放在 div 类 &lt;div class="gd#{index} zoom" 中吗?
    • @Maxxx 你很接近了!您应该删除 each_with_index 块内重复的 div。只需在我的答案中添加一个作为代码即可。这将遍历所有图像并渲染它们(每次迭代一个)。这就是为什么您重复所有图像的原因。 "gd#{index} zoom" 是一个字符串插值,将根据index 的值呈现为"gd1 zoom""gd2 zoom" 等。顺便说一句,使用 {index+1} 匹配您的 gd 类。看看这个以了解字符串插值ruby-for-beginners.rubymonstas.org/bonus/…
    猜你喜欢
    • 2017-04-29
    • 2012-11-24
    • 2014-09-02
    • 2013-05-10
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多