产品#index中的ActionController :: UrlGenerationError

时间:2016-01-04 19:50:55

标签: ruby-on-rails ruby

我试图将索引页面(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属性,其中包含图像。

1 个答案:

答案 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模型。

您可以使用PaperclipCarrierwave执行此操作:

#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 %>