rake task で長時間起動するため排他処理をしておかないと複数起動してしまう物があったので多重起動を禁止にしました。
namespace :foo do task :update_all => :environment do |task| process_count = `ps -ef | grep #{task.name} | grep -v grep | wc -l`.to_i next if process_count > 1 end end でOK。呼び出し部分をメソッド化とかしたかったけど、上手くいかなかったのでとりあえずこれで。タスクのブロック引数としてtaskをちゃんと書いておかないとtask.nameが使えないので注意しましょう。
参考 [ShellScript – Rakeタスク実行時、プロセス起動数を確認して排他制御する – Qiita][1]
task :do_something do return if some_condition? do_job end というように条件に合致しない時に returnを使って処理を抜けようとするとこんなエラーになります。
LocalJumpError: unexpected return これは rake task がメソッドではなくブロックだから起きるので next を使ってやりましょう。それで抜けれます。
task :do_something do next if some_condition? do_job end ちなみにnextは気持ち悪いんのでせめてbreakを使いたいと思ったんですが、それだと
LocalJumpError: break from proc-closure になってしまいます。
参考 [ruby – How do I return early from a rake task? – Stack Overflow][1]
Railsで既にindexをつけているカラムにunique制限をもうけるには、ユニーク制限だけを付加することができないので一旦インデックス自体を削除してから新規に unique な index を追加します。
def change remove_index :editabilities, [:user_id, :list_id] add_index :editabilities, [:user_id, :list_id], unique: true end 参考 [ruby on rails – How to add unique constraint to already existing index by migration – Stack Overflow][1]
Rubyの命名規則としてクラス名は通常はCamelCaseで記述しますが、HTTPなどの頭字語(Acronym)はそのまますべて大文字で記述します。
Railsで頭字語のクラス名を使うときはモデル等を生成する前に設定で以下の記述を行っておくと自動的に認識してくれます。
config/initializers/inflections.rb ActiveSupport::Inflector.inflections(:en) do |inflect| inflect.acronym 'GNU' end ただhas_manyでこのクラスを持とうとすると以下のエラーになってしまいます。
LoadError: Unable to autoload constant Gnu, expected
/Users/ironsand/dev/myproject/app/models/gnu.rb to define it
対策 クラス名を明示的に指定するとOKです。
has_many :gnus, class_name => "GNU"
RailsでPostgresqlを使うときに毎回そのためのユーザーの作成方法を忘れてしまうのでメモ。
まずユーザーを作成 WindowsでChocolateyを使ってpostgresqlをインストールしてると初期パスワードはPostgres1234になってるので、
$ psql.exe -U postgres ユーザ postgres のパスワード: ←ここでパスワードを入力 psql (9.2.1) "help" でヘルプを表示します. postgres=# create user deployer; CREATE ROLE postgres=# alter user deployer with superuser; ALTER ROLE これでパスワード無しのdeployerユーザーが必要な権限付きで作成される。
※ Linux系のOSならsudo -u postgres psqlでpsqlコマンドを使いましょう。
パスワード無しユーザーでもOKにする これだけだとfe_sendauth: no password suppliedというエラーが出てしまうので
C:\PostgreSQL\data\pg_hba.confを開いて
# IPv4 local connections: host all all 127.0.0.1/32 md5 # IPv6 local connections: host all all ::1/128 md5 を
# IPv4 local connections: host all all 127.0.0.1/32 trust # IPv6 local connections: host all all ::1/128 trust に書き換える。
twitter-bootstrap-railsを普通にWindowsで使おうとするとlibv8がないからアカンで~的なエラーが出てきてインストールに失敗します。
対策 特定のバージョンはインストールできるのでそれをインストールしましょう。
gem install libv8 --version 3.11.8.0
あとはGemfileにgem 'therubyracer', platforms: :rubyのコメントアウトを外してgem twitter-bottstrap-railsを追加すれば万事OK!
追記、より良い解決策 そもそもbootstrap-sassを使えばよいのでは?
RailsのDBからGETでデータの呼び出しはできるけど、PUTで値の追加ができなくてこんなエラーに成った時の対処法
Completed 422 Unprocessable Entity in 126ms ActionController::InvalidAuthenticityToken - ActionController::InvalidAuthenticityToken: 原因 CSRF対策です。
ダメな対策 モデルにこれを追加
skip_before_filter :verify_authenticity_token サイバーノーガード戦法です。おすすめしません。
良さそうな対策 gem の<a href="https://github.com/xrd/ng-rails-csrf">ns-csrf-rails</a>を使う。わからないことは全部gemにまかせてしまいましょう。
db/seeds.rbにUser.createでencrypted_passwordを与えてDeviseのユーザーを作ろうとしたら失敗した。
原因 passwordが存在しないためにvalidationに引っかかってしまってる。
対策 passwordを平文で打てば解決するらしいけど、平文のパスワードは使いたくないのでバリデーションの方を無効化してしまいましょう。
User.new(email: someone@example.com).save(validate: false)
でOKです。encrypted_passwordの取得方法は色々あるでしょうが、自分の場合は一度Deviseで作ってからそれをrails console使ってUser.first.encrypted_passwordを取ってきました。
参考 [Cannot create Devise account using rake db:seed for Rails 3.0 – Stack Overflow][1]
/usr/bin/env: ruby.exe: そのようなファイルやディレクトリはありません
というエラーがwheneverで作ったcronのログとして出てきて困ってた。
bin/railsの実行権限とか/usr/bin/env ruby --version でちゃんとrubyが動いてるかどうか確認したりとか色々。
答え Windowsで作ったRailsプロジェクトだったので ruby<strong>.exe</strong>になってた。なんてことだ…。
解決策 bin/railsの一行目usr/bin/env ruby.exeの.exeを削除しておきましょう。ふぁっく。
“Everyday Rails Testing with RSpec”を購入して読んでると
サンプルプロジェクトが紹介されてたのでgit cloneでダウンロードしてきて bundle install をすると
rbenv: version '2.0.0' is not installed
と出ちゃって困る。しかも ruby -v と確認しようと思ったら再び
rbenv: version '2.0.0' is not installed
??????
「まさか rbenv が壊れた!?」と思って調べてたら、どうやらカレントディレクトリに.ruby-versionがあるとそのバージョンのRubyを参照しようとするために起きるらしい。
対策 自分の場合は2.0.0.p247が入っているので該当のディレクトリでrbenv localすると.ruby-versionの中身が書き換えられて上手く動くようになりました。
Version自体が異なる場合は上手く動かないと困るので該当のバージョンの ruby をrbenv install 2.x.xでインストールしましょう。