将paperclip图像称为深层嵌套资源

时间:2013-08-27 05:09:20

标签: ruby-on-rails associations paperclip

我一直在努力解决这个问题差不多一个月了,似乎无法解决这个问题。我对RoR很新,并且我确信有一些基本的我可以忽略......帮助非常感谢!

我有三个资源相互嵌套:(1)书籍,(2)章节,(3)页面。 Page模型通过paperclip gem具有图像属性。

每种模型如下:

  class Book < ActiveRecord::Base
  attr_accessible :synopsis, :title   
  has_many :chapters

  class Chapters < ActiveRecord::Base
  attr_accessible :synopsis, :title    
  belongs_to :book
  has_many :pages

  class Pages < ActiveRecord::Base
  attr_accessible :page_image, :page_number
  has_attached_file :page_image, styles: { medium: "1024x768>",  thumb: "300x300>" }
  belongs_to :chapter

如您所见,每个页面都有一个图像。在Book show 页面中,我希望有一个部分显示属于该Book的所有章节,每个章节的链接将是属于该章节的第一页的图像。< / p>

图书管理员:

class BookController < ApplicationController
...
def show
    @book = Book.find(params[:id])
    @chapters = @book.chapters.all

    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @book }
    end
  end
...

图书的展示视图:

<ul class="thumbnails">
  <% @chapters.each do |chapter| %>
  <li class="span3">
    <div class="thumbnail">
        <%= image_tag chapter.pages.first.page_image %>
    </div>
  </li>
  <% end %>
</ul>

这是我得到的错误:

undefined method `page_image' for nil:NilClass
Extracted source (around line #5):

2:   <% @chapters.each do |chapter| %>
3:   <li class="span3">
4:     <div class="thumbnail">
5:      <%= image_tag chapter.pages.first.page_image %>
6: 

1 个答案:

答案 0 :(得分:1)

你的所有章节都有页面吗?看起来其中一个没有,first正在返回nil

chapter.pages.first.page_image

意味着,对于给定的章节(来自@chapters),获取一个页面数组。进入第一页(如果没有页面,则为nil)。点击page_image就可以了。

您可能想要的是

image_tag chapter.pages.first.try(:page_image).try(:url, :thumb)

try方法将测试调用它的对象是nil,如果是,则返回nil而不是导致异常。