控制器嵌套元素增加的问题

时间:2016-12-08 23:22:20

标签: ruby-on-rails nested increment

我试图创建一个可以在线阅读的杂志。为此,我为杂志本身创建了一个脚手架,然后另一个脚手架嵌套在第一个脚本中。在此之后,我创建了一个系统,允许从杂志脚手架进行多重上传,这将自动在页面的脚手架中为同一时间上传的每个图像创建一个新条目(一个图像=一页)。

经过一些尝试,我认为将id设置为页码并不是非常聪明,因为它会自动增加并且不会再次从1开始。所以我在页面脚手架中创建了一个名为" page_number"的新列,当多上传表单中的第一张图像被上传/添加到页面脚手架时,它将设置为1,然后下一页将得到这个数字的增量。

无论如何,这里是我的控制者(相关部分)

class MagazinesController < ApplicationController
#Some code..

  def create
    @magazine = Magazine.new(magazine_params)

    if @magazine.save
      if params[:images] #If there are images loaded in the multi upload form
        params[:images].each { |image, index| #for each of them...
          if index == 0 
            @magazine.pages.page_number = 1 #Set the first one's page_number to 1
          else
            @magazine.pages.page_number += 1 #Set its incrementation after that
          end
          #Save each of the images as a new image from the :image scaffold
           @magazine.pages.create(image: image) 
        }
      end
      redirect_to @magazine, notice: 'Magazine créé'
    else
      render :new
    end
  end

#Some code..

end

我的问题是,即使在迁移完成后重新启动服务器,当我尝试上传新杂志时,我也会收到以下错误:undefined method 'page_number' for #<ActiveRecord::Associations::CollectionProxy []>

当我抬头看网络时,我找到了两种方法来增加内容,通过模型和SQL请求以及通过控制器和这种方法来满足我的需求。我不知道如何解决这个问题,因为我需要在另一个嵌套元素中指定内容,一切都很顺利,没有任何问题,因为RubyMine建议这个&#34; page_number&#34;在&#34; @ magazine.pages&#34;之后添加一个点后没有麻烦。

我忘了什么?

提前谢谢

1 个答案:

答案 0 :(得分:1)

我会稍微改写你的代码:

def create
  @magazine = Magazine.new(magazine_params)

  if @magazine.save
    (params[:images] || []).each_with_index do |image, index| #for each of them...
      #Save each of the images as a new image from the :image scaffold
      @magazine.pages.create(image: image, page_number: index + 1) 
    end
    redirect_to @magazine, notice: 'Magazine créé'
  else
    render :new
  end
end

您收到的错误是因为您尝试将pages关系分配给page_number,这是不存在的。 @magazine .pages是一个不是实例的关系,因此该关系没有定义该(page_number)方法。

我做的是,我只是将page_number分配给page行中创建的@magazine.pages.create...实例,索引将与索引+ 1对齐循环。

(params[:images] || []).each只是为了避免让if检查请求中是否有images param,如果没有,则循环将不会执行,因为数组将为空(|| [])。