0

我已经为这个问题苦苦挣扎了将近一个月,似乎无法弄清楚。我对 RoR 相当陌生,并且确信我忽略了一些基本的东西......非常感谢帮助!

我有三个相互嵌套的资源:(1)书籍,(2)章节,(3)页面。Page 模型通过回形针 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

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

图书控制器:

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: 
4

1 回答 1

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而不是引发异常。

于 2013-08-27T05:26:09.853 回答