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
基本的にはこちらのページを見れば実装できます。