我正在尝试创建一个根据类别显示图片的应用,类别是图片的属性,如下所示:
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;类别。这也不是我想要的。
任何帮助将不胜感激!
答案 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
仅查询所需的记录,而不是在模板中迭代它们时对其进行过滤。