我似乎遇到了一个可能对我来说更明显的问题:如何从相关模型中获取某些属性以在视图中显示。
在我的应用程序中有以下两种模型:
产品
product_images
我正在写这篇文章,但我没有准确的代码。但是,我创建了必要的关联,以便产品has_many
product_images和product_image belongs_to
产品。图像模型有一个url,一个默认(布尔)标志,当然还有product_id。
在产品索引视图中,我想显示该产品的默认图像。为了简单起见,我们假设我很好地展示了第一张照片 - 一旦有效,条件应该很容易引入。
所以在我的产品索引视图中有这样的东西(再次,只是从内存中):
@products.each do |p|
<h3><%= p.name %></h3>
<%= image_tag p.product_images.first.url %>
<p><%= p.description %></p>
end
虽然只要我包含image_tag,产品的描述和名称就会显示正常,但我的视图中断了NoMethodError,指出url是Class Nil中未定义的方法。
为了使它更简单,我摆脱了image_tag,只是想看到一个段落中打印的网址 - 当然问题仍然存在。
如果我只是尝试获取p.product_images.first
视图打印我假设的对象/模型的某种ID就好了,这告诉我关联本身是好的。那么为什么Rails认为url属性应该是一个方法?
我还使用rails控制台检查了这是否是检索相关属性的正确语法。像这样(再次,从内存 - 语法错误可能):
p = Product.first
=> [successful - shows the first product]
p.product_images.first
=> [successful - shows the first image model]
p.product_images.first.url
=> [successful - shows me the single attribute, the url to the image]
正如您现在所知,我对此非常陌生,非常感谢您的帮助。当然我阅读了Rails文档,但是Active Record查询指南主要侧重于从当前模型中获取数据,而我无法找到我在示例应用程序中明显缺少的内容。
为什么这在控制台中有效但在视图中不起作用?
答案 0 :(得分:1)
可能是因为您的Product
之一没有任何ProductImage
。
您可以通过在ProductsHelper
中添加方法来更正此问题:
def product_image(product)
return if product.product_images.blank?
image_url = product.product_images.first.url
return if image_url.nil?
image_tag(image_url).html_safe
end
然后从您的视图中调用它:
@products.each do |p|
<h3><%= p.name %></h3>
<%= product_image(p) %>
<p><%= p.description %></p>
end