読者です 読者をやめる 読者になる 読者になる

rails "undefined method '**_image will_change!' エラーの対処 【carrierwave】

開発環境
OS X 10.9.5 
rails 4.2.0
ruby 2.1.0


carrierwave
mini_magick
cocoon

問題

ネストしたモデルでcocoon複数画像アップロードを実装しようとしましたが、createのところで"undefined method 'post_image will_change!'" というエラーが出ました。

結論

原因は、post_detailsテーブルのカラム名の設定ミスでした。

データ構造

# models/post.rb

class Post < ActiveRecord::Base
    has_many :post_details

    accepts_nested_attributes_for :post_details, reject_if: :all_blank, allow_destroy: true
end
# models/post_details.rb

class PostDetail < ActiveRecord::Base
  belongs_to :post

  mount_uploader :post_image, PostImageUploader
end
# controllers/posts_controller.rb

class PostsController < ApplicationController
    def index
        @posts = Post.all
    end

    def new
        @post = Post.new
    end

    def create
        @post = Post.new(create_params)
        if @post.save
          redirect_to post_path(@post)
        else
            render :new
        end
    end

    def show 
        @post = Post.find(params[:id])
    end


    private

    def create_params
        params.require(:post).permit(:title, post_details_attributes: [:name, :post_image, :remote_post_image_url])
    end
end
# views/posts/_post_detail_fields.html.erb

<div class="nested-fields">

~~中略~~

<%= f.label :remote_post_image_url, class: 'form-control-label' %>
  <%= f.text_field :remote_post_image_url, class: 'form-control'  %>

~~中略~~

</div>

問題は、post_detailsテーブルのカラム名でした。

# db/migrate/20150324**_create_post_details.rb

class CreatePostDetails < ActiveRecord::Migration
  def change
    create_table :post_details do |t|
      t.string :name
      t.string :image
      t.references :post, index: true

      t.timestamps null: false
    end
    add_foreign_key :post_details, :posts
  end
end

画像を格納するカラム名imageにしていたのがミスでした。

対処

post_detailsテーブルにpost_imageカラムを追加して解決!

$ bundle exec rails g migration AddPostImageToPostDetail post_image:string
$ bundle exec rake db:migrate

基本的にはこちらのページを見れば実装できます。

www.workabroad.jp