【问题标题】:How to put images into an array Ruby on Rails如何将图像放入数组 Ruby on Rails
【发布时间】:2014-08-17 01:40:55
【问题描述】:

我有一个 Ruby on Rails 应用程序,它允许用户保存最多 6 张图像,然后可以在轮播中查看这些图像。

图像以字符串形式保存为 image, image_2, image_3, image_4, image_5, image_6。

我希望能够编写一个“for”循环来显示轮播中的所有图像。

将所有这些图像字符串组合成一个数组以便它们可以循环并由轮播输出的最佳方法是什么?

更多详情

我目前正在调用如下所示的图像,这些图像有效但不是特别干燥。

<div style="position:relative">
  <div id="home-carousel" class="carousel">
    <div class="carousel-inner">

      <div class="item active">
        <%= image_tag @place.image %>
      </div>

      <% if @place.image_2.present? %>
        <div class="item">
          <%= image_tag @place.image_2 %>
        </div>
      <% end %>

      <% if @place.image_3.present? %>
        <div class="item">
          <%= image_tag @place.image_3 %>
        </div>
      <% end %>

      <% if @place.image_4.present? %>
        <div class="item">
          <%= image_tag @place.image_4 %>
        </div>
      <% end %>

      <% if @place.image_5.present? %>
        <div class="item">
          <%= image_tag @place.image_5 %>
        </div> 
      <% end %>

      <% if @place.image_6.present? %>  
        <div class="item">
          <%= image_tag @place.image_6 %>
        </div>
      <% end %>

    </div>
  </div>
</div>

我希望能够将下面的内容转换为一个简单的 for 循环,该循环将遍历 6 个图像对象中的每一个并返回其中的对象。更像这样的东西:

<div style="position:relative">
  <div id="home-carousel" class="carousel">
    <div class="carousel-inner">
      <% @place.images.each do |image| %>
        <div class="item">
          <%= image_tag image %>
        </div>
      <% end %>
    </div>
  </div>
</div>

【问题讨论】:

  • 向我们展示上下文以及您尝试过的内容
  • 当您提到图像“字符串”时,您是什么意思?你的意思是他们的本地化路径?

标签: ruby-on-rails ruby-on-rails-3 for-loop each


【解决方案1】:

简单的解决方案是添加一个助手。所以在helpers/places_helper.rb

module PlacesHelper

  def get_carrousel_images(place)
    [
      @place.image_1,
      @place.image_2,
      @place.image_3,
      @place.image_4,
      @place.image_5,
      @place.image_6
    ].select {|img| img.present? }
  end

然后你可以在你的视图中写下以下内容:

<div style="position:relative">
  <div id="home-carousel" class="carousel">
    <div class="carousel-inner">
      <% get_carrousel_images(@place).each do |image| %>
        <div class="item">
          <%= image_tag image %>
        </div>
      <% end %>
    </div>
  </div>
</div>

现在有 6 个 image_x 字段作为 place 看起来有点臭,所以我更喜欢 Rich Peck 建议的嵌套模型,尽管我知道有 6 个字段更容易开始。

【讨论】:

  • 感谢您的帮助 Nathanvda 只要始终有 6 张图像,这似乎就可以工作。当它缺少图像时,它会返回 'src="/assets"',这意味着根本不显示任何图像。如果图像对象为空白,我该如何处理?
  • 我执行compact,它应该删除零位。如果没有图片,是image_x nil 还是空字符串?
  • 啊,我的错,它们以 nil 的形式出现,它正在删除它们不存在的地方。似乎现在可以工作了:)
  • 哦,不。它又坏了。它传回了一个 src="assets"。
  • 你必须给我更多的信息。代码不会简单地工作然后不工作。你能找出有什么区别吗?什么时候有效,什么时候无效?但是假设你给我们的代码总是有效的,我假设有些确实有空字符串而不是 nil,所以我用 select 替换了 compact,它模仿了你上面的代码。
【解决方案2】:

图片

这完全取决于您如何在数据库中设置 images,以及您希望如何在视图中显示它们

如果您有 User 模型中的图像,您可以这样称呼它们:

app/controllers/users_controller.rb
Class UsersController < ApplicationController
   def show
       @user = User.find params[:id]
       @images = @user.images
   end
end

这显然是非常笼​​统的 - 我建议您为您的问题发布一些背景信息,以便我们知道您具体要问什么

--

回形针

如果您使用PaperclipCarrierwave,您基本上会将图像附加到数据库中的各种对象。例如,您将拥有以下内容:

#app/models/image.rb
Class Image < ActiveRecord::Base
   has_attached_file :attachment
end

这允许你调用:

@images = Image.all
@images.each do |image|
   image.attachment.url #-> image URL
end

这是在 Rails 中处理图像/附件的标准方法,因为它直接绑定到 ActiveRecord。因此,返回 image 路径数组将是调用 Model.allModel.where 的情况

【讨论】:

  • 感谢您的回复丰富!我在上面添加了一些进一步的解释。此实例中的图像使用carrierwave gem 保存在Place 模型中。希望我上面的额外信息会让事情变得更清楚:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多