按类别显示图像(Ruby on Rails)

时间:2018-04-26 15:39:43

标签: html ruby-on-rails

我正在尝试创建一个根据类别显示图片的应用,类别是图片的属性,如下所示:

create_table "images", force: :cascade do |t|
  t.string   "caption"
  t.datetime "created_at",     null: false
  t.datetime "updated_at",     null: false
  t.string   "i_file_name"
  t.string   "i_content_type"
  t.integer  "i_file_size"
  t.datetime "i_updated_at"
  t.integer  "user_id"
  t.string   "category"
end 

我希望index.html.erb页面有几个链接/按钮,可以呈现每个类别的所有图片。我试图让索引页面只显示一个类别的图像:

<% @images.each do |post| %>
  <% if post.category == "Portfolios" %>
    <%= link_to (image_tag post.i.url(:medium)), image_path(post) %>
    <%= post.caption %>
    <%= post.category %>
  <% end %>
<% end %>

但是当我这样做时没有出现任何内容,包括post.category,即使我已经将一些图像分配给&#34;投资组合&#34;类别。这也不是我想要的。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

这与您的问题不同,但会间接解决问题:我建议您制作一个Category模型/表格,并与您的Image模型相关联。您创建了一个categories表,其中包含name列,然后将categories表上的images列替换为category_id整数外键列(就像你定义图像和用户之间的关系一样)。您可以这样定义关系:

# app/models/image.rb
class Image < ActiveRecord::Base
  belongs_to :category
end

# app/models/category.rb
class Category < ActiveRecord::Base
  has_many :images
end

然后,如果您想要特定类别中的所有图片,您只需执行此操作:Category.find_by_name('Portfolios').images。或者,要创建链接到每个类别中的图像列表的类别列表,您可以使用nested resource。在类别索引上,您将迭代每个类别并生成指向其嵌套图像的链接。整件事情看起来像这样:

# config/routes.rb
#...
resources :categories, only: [:index] do
  resources :images, only: [:index]
end
#...

# controllers/categories_controller.rb
class CategoriesController < ApplicationController
  def index
    @categories = Category.order(name: :asc)
  end
end

# controllers/images_controller.rb
class ImagesController < ApplicationController
  before_action :set_category

  # NOTE: nested beneath /categories/:category_id/
  def index
    @images = @category.images
  end

  private

    def set_category
      @category = Category.find(params[:category_id])
    end
end

# app/views/categories/index.html.erb
<% @categories.each do |category| %>
  <%= link_to category.name, [category, :images] %>
<% end %>

# app/views/images/index.html.erb
<% @images.each do |image| %>
  <%= link_to (image_tag(image.i.url(:medium))), image_path(image) %>
  <%= post.caption %>
  <%= post.category %>
<% end %>

如果您想保留当前架构,则需要使用where来提高效率,这最终会在您的SQL查询中添加WHERE子句。我不知道在您的模板中设置@images变量是什么,但我认为它类似Image.all。相反,您应该将其设置为您想要的图像。在这种情况下,您可以将其设置为:@images = Image.where(category: 'Portfolios'),然后您只需在模板中迭代它们,就像这样:

<% @images.each do |post| %>
  <%= link_to (image_tag post.i.url(:medium)), image_path(post) %>
  <%= post.caption %>
  <%= post.category %>
<% end %>

请注意,不再有条件。在您的示例中,您正在查询所有图像,这会导致Rails为每个图像实例化一个对象,甚至是不在您不需要的投资组合类别中的对象。相反,您应该使用where仅查询所需的记录,而不是在模板中迭代它们时对其进行过滤。