我试图将索引页面(products_path)中的每个图片链接到我的展示页面。
在我的控制器中,我目前有:
class ProductsController < ApplicationController
before_action :find_product, only: [:show]
def index
@products = Dir.glob("#{Rails.root}/app/assets/images/*.jpg")
end
def show
end
private
def find_product
@product = Product.find(params[:id])
end
end
在我的索引视图页面中:
<% Dir[File.join("public/assets", "*.jpg")].each do |file| %>
<%= link_to image_tag file.gsub('public', ''), product_path(@product), class: 'img-responsive col-lg-3' %>
<% end %>
这会导致我一直试图解决的错误。我希望任何人都有这方面的错误经验。
No route matches {:action=>"show", :controller=>"products", :id=>nil} missing required keys: [:id]
我认为&#39;产品&#39;是空的,但当我检查控制台时,有一些Product属性,其中包含图像。
答案 0 :(得分:0)
@products = Dir.glob("#{Rails.root}/app/assets/images/*.jpg")
这是什么?
为什么要使用assets/images
目录中所有图像的glob填充实例变量?您可以在视图中调用它。
你不应该在控制器中有这个;你甚至不应该拥有它,因为它是一个糟糕的模式(不是面向对象的)。
-
No route matches {:action=>"show", :controller=>"products", :id=>nil} missing required keys: [:id]
此错误是由于您在没有适当link_to
的情况下调用id
来发送请求而导致的。 我感谢您发送 @product
;它要么没有被正确调用,要么你的调用不正确。
这里的问题是您传递@product
而未实际设置它... before_action :find_product, only: [:show]
- index
操作不会@product
可用。
此问题将在我的建议下修复。或者简单地说,您必须使用link_to
值或对象填充id
。
您应该将图片附加到Product
模型。
您可以使用Paperclip
或Carrierwave
执行此操作:
#app/models/product.rb
class Product < ActiveRecord::Base
has_attached_file :image #-> paperclip implementation
end
这将允许您上传模型本身的图像(如果需要,我可以写更多相关信息)。
然后您就可以使用OOP模式:
#app/controllers/products_controller.rb
class ProductsController < ApplicationController
def index
@products = Product.all
end
end
然后在你看来:
#app/views/products/index.html.erb
<% @products.each do |product| %>
<%= product.name %>
<%= image_tag product.image.url %>
<% end %>