Rails "warning: already initialized constant ActiveRecord::Base::OrmAdapter" エラーの対処

開発環境

OS X 10.9.5 
rails 4.1.6
ruby 2.1.0

問題

Railsのバージョンを4.2.0から4.1.6に切り替えたのちに、

$ bundle exec rails c

をしたところ、

"warning: already initialized constant ActiveRecord::Base::OrmAdapter" 
"warning: previous definition of OrmAdapter was here"

などのエラーが出た。

結論

$ bundle exec rake rails:update

で解決。

経緯

$ rails new をしたときは rails 4.2.0 だったが、その後Gemfileを

gem 'rails', '4.2.0'

↓

gem 'rails', '4.1.6'

と書き換えて bundle install。

この後、rails c をしたところエラーが発生した。

対処

参考サイト

Rails server not running due to ORM Adapter · Issue #36 · ianwhite/orm_adapter · GitHub

どうやら、Gemfileをいじって bundle install するだけではだめで、rakeのほうでも変更を反映させる必要があるらしい。

$ bundle exec rake rails:update

このコマンドを実行すると、以下の様なコンフリクトが発生する。

conflict  config/boot.rb

conflict  config/application.rb

conflict  config/secrets.yml

conflict  config/environments/development.rb

conflict  config/environments/production.rb

conflict  config/environments/test.rb

conflict  config/initializers/assets.rb

conflict  config/initializers/cookies_serializer.rb

conflict  config/initializers/session_store.rb

conflict  bin/rails

conflict  bin/rake

すべてyesでポチポチエンターを押していけば問題ない。 これで解決。

Rails "uninitialized constant ****Controller" の対処法

開発環境
OS X 10.9.5 
rails 4.2.0
ruby 2.1.0


devise
carrierwave
mini_magick

問題

root_url/admin 

にアクセスした際に、"Routing Error uninitialized constant AdminController" と出た。

結論

・admin_controller.rb が存在していなかった。
・Controllerの継承を意識していなかった。

データ構造

deviseでサインアップする際に、アイコン画像を設定できるようにするために、Strong Parametersに"icon"パラメータを追加した。また、肥大化を防ぐためにControllerが若干複雑になっている。

なお、rooturl/admin では、ログインしているユーザーの投稿一覧が表示されるようにしたい。

# config/routes.rb

~~中略~~

match 'admin', to: 'admin#show', via: 'get'

~~中略~~
# controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_filter :configure_permitted_parameters, if: :devise_controller?

  protect_from_forgery with: :exception

  protected

    def configure_permitted_parameters
      devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:screen_name, :icon, :remote_icon_url, :email, :encrypted_password, :password) }
    end
end
# controllers/authorized_controller.rb

class AuthorizedController < ApplicationController

  before_action :authenticate_user!

end

対処

肝心のAdminControllerが存在していなかったため、controllers/admin_controller.rb を作成。

# controllers/admin_controller.rb

class AdminController < AuthorizedController

  def show
  
    @articles = current_user.articles
        
  end

end

その後ページをリフレッシュして解決。

このエラーに遭遇したら、ルーティングだけではなく、Controllerの継承と有無についても検証してみると良いでしょう。

"Starting MySQL . ERROR! The server quit without updating PID file (/usr/local/var/mysql/**.local.pid)." エラーの対処

開発環境
OS X 10.9.5
mysql  Ver 14.14 Distrib 5.6.23, for osx10.9
Homebrew 0.9.5

エラー

mysqlのサーバーが立っていなかったので、

$ sudo mysql.server start 

をしたところ

Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/**.local.pid).

このエラーが出た。これはPCの再起動後などに出るが、色々な問題・解決方法があり、非常に厄介なエラー。

結論

$ sudo chown -R _mysql:_mysql /usr/local/var/mysql

今回は、これでmysql以下のファイルの所有者をすべて_mysqlにすると解決した。

$ sudo mysql.server start
Starting MySQL
. SUCCESS! 

補足

上記の他にも、状況によって

  • /usr/local/var/mysql/ 以下の .err ファイルを消す
  • /usr/local/var/mysql/ 以下の .pid ファイルと ps -alx | grep mysql で残ったプロセスをキルする
  • /usr/local/var/mysql/ 以下の .err ファイルの所有者を _mysql からホストに変更する

などの方法があるので、その場その場で対応しましょう。

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

git pushで100MBを超えてエラーが出たときの対処法

開発環境
OS X 10.9.5
git version 2.3.2

pushしようとしたら以下のエラーがでた

$ git push origin master

Counting objects: 4924, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4534/4534), done.
Writing objects: 100% (4924/4924), 91.29 MiB | 2.22 MiB/s, done.
Total 4924 (delta 547), reused 0 (delta 0)
remote: error: GH001: Large files detected.
remote: error: Trace: 68fe267b6067c61b005039be456ed1bb
remote: error: See http://git.io/iEPt8g for more information.
remote: error: File vendor/bundle/ruby/2.1.0/gems/libv8-3.16.14.7-x86_64-darwin-13/vendor/v8/out/x64.release/libv8_base.a is 150.14 MB; this exceeds GitHub's file size limit of 100 MB

問題になっているのは以下のファイルであることがわかる

vendor/bundle/ruby/2.1.0/gems/libv8-3.16.14.7-x86_64-darwin-13/vendor/v8/out/x64.release/libv8_base.a

以下のコマンドを入力

$ git filter-branch --tree-filter 'rm -f vendor/bundle/ruby/2.1.0/gems/libv8-3.16.14.7-x86_64-darwin-13/vendor/v8/out/x64.release/libv8_base.a' HEAD

その後

$ git push -u origin master

これで解決。

Sublime Text 2 をMacのターミナルから開けるようにするコマンド

開発環境
OS X 10.9.5 Mavericks

以下のコマンドを入力すればOK。

$ ln -s "/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl" /usr/local/bin/subl
$ subl .

これでカレントディレクトリ以下がツリーになって開かれれば成功です。

ちなみに公式ドキュメントでは以下のようになっていてうまくいきませんでした。

ln -s "/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl" ~/bin/subl

ドキュメントどおりにやってうまくいかなかった場合は、どこにパスが通っているのかを確認する必要がありますね。

ちなみに、以下のコマンドでパスを確認できます。

$ echo $PATH

参考にさせていただいたサイト

SublimeText2をMacにインストールしてターミナルから起動できるようにする。 | 心はいつもAirPucci (空元気でもいいから)

Ruby on Rails をバージョン指定してインストールする方法

開発環境
OS X 10.9.5 Mavericks
Ruby 2.1.0
rbenv 0.4.0

記法は以下のようになっています

$ gem install rails --version="3.2.17" #指定バージョンをインストール
$ gem install rails --version="~>3.2.0" #3.2.X系の最新バージョンをインストール
$ gem install rails --version="~>3.0" #3.X系の最新バージョンをインストール
$ gem list local

これでlocalに入っているrailsを確認します。

$ rbenv rehash

これをすることによって、gemの変更が反映されます。

$ rails -v 

これで自分の入れたかったバージョンが表示されれば成功です。

以下のサイトを参考にさせていただきました。

Rails のバージョンを指定してインストールする - hidemium's blog

rbenvで管理してるrubyのそれぞれに別のrailsをインストールしてみる - Qiita