2016-12-08 8 views
0

オンラインで読むことができる雑誌を作成しようとしています。そうするために、私は雑誌そのもののための足場を作りました、そして、ページのための最初のものの中に入れ子にされた別の足場。その後、マガジンスキャフォールドからのマルチアップロードを許可するシステムを作成しました。これは、同じ時間にアップロードされた各画像(1つの画像= 1ページ)ごとに自動的にページの足場内に新しいエントリを作成します。コントローラのネストされた要素のインクリメントの問題

いくつか試してみたところ、ページ番号としてIDを設定すると自動でインクリメントされ、再び1から開始しないため、スマートではないことがわかりました。だから、私は、複数のアップロードフォームの最初のイメージがページの足場にアップロード/追加されたときに1に設定される、 "page_number"という名前のページ足場の中に新しい列を作成し、次のページでこの番号の増分を取得します。

とにかくここに私のコントローラは、(その関連部分)

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リクエストとコントローラとこの方法で、私のニーズに合ったものを増やす方法が2つ見つかりました。 RubyMineは「@ magazine.pages」の後にドットを追加した後、この「page_number」を問題なく提案しているので、問題のない状態で、すべてがうまくいっていたため、これを解決する方法はわかりません。 。

私は何を忘れましたか?

は、事前にありがとう

私はあなたのコードを少し書き換えます

答えて

1

:あなたがあるpages関係page_numberに割り当てるしようとしているので、あなたが取得しているエラーがある

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.create...行に作成されたpageインスタンスにpage_numberを割り当てているだけです。インデックスはループのインデックス+1に揃えられます。

(params[:images] || []).eachが来ない場合は、配列は(|| [])空になりますので、ループは実行されません、ただimages paramはリクエストで来るかどうかをチェックするためにifを回避することです。

+0

ありがとうございました。なぜ私はこの問題を抱えているのですか?しかし、私は自分のコードを書き直しましたが、今は次のエラーがあります: 'undefined method '+' for nil:NilClass'。 "page_number"が何であるかを理解する.. – Jaeger

+1

申し訳ありませんが、 '.each'は' .each_with_index do | image、index | 'でなければなりません。答えを編集しましょう。 – fanta

+1

ありがとう、私はそれが 'each_with_index'だったことに気づいても疲れました。とにかく、それはスムーズに働きました、ありがとう、私は私自身でこの解決策を見つけるだろうとは思わない! – Jaeger

関連する問題