Rails:如何从相关模型中检索属性?

时间:2013-07-22 06:38:55

标签: ruby-on-rails ruby-on-rails-3 activerecord model attributes

我似乎遇到了一个可能对我来说更明显的问题:如何从相关模型中获取某些属性以在视图中显示。

在我的应用程序中有以下两种模型:

产品
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查询指南主要侧重于从当前模型中获取数据,而我无法找到我在示例应用程序中明显缺少的内容。

为什么这在控制台中有效但在视图中不起作用?

1 个答案:

答案 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