スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

CarrierWave を使って Rails で画像をアップロード

Railsで画像等のファイルをアップロードして扱うために、CarrierWaveとRMagickを使ってみます。


【0】概要

GitHub:CarrierWave
特徴:篳篥日記「[Rails] file_column から CarrierWave へ (序)」

特に2つ目のページがよくまとまってます。


【1】環境

OS:Ubuntu 12.04 (Precise)
Ruby:1.9.3-p194
Rails:3.2.0


【2】CarrierWaveのインストール・使い方

参考サイト:GEEKZ「Railsでcarrierwaveを使って画像ファイルのアップロード」

基本的に上記サイトに従ってインストールを進めていきます。

$ bundle install


CarrierWaveを使うためには、アップロード用のクラスを作成します。
ここでは、画像アップロード用のImageクラスを作ります。

$ rails generate uploader image

上記のコマンドを実行すると、rails_root/app/uploaders/image_uploader.rb が作成されます。

続いて、このクラスを利用するクラスを設定します。

Userクラスにプロフィール画像を設定すると仮定すると、

$ rails generate scaffold User name:string image:string

このクラスに以下の内容を追記します。

さらに、アップロードを行うためにviewを編集します。
アップロードした画像は以下のようにして表示できます。


【3】CarrierWaveの設定いろいろ

CarrierWave の設定をいじるには、作成したアップロード用のクラスを編集します。

保存方法(ファイル保存、DBにbinaryで保存など)

以下のようにして、保存先をいろいろ設定できます。
上記の設定でファイルに保存されます。
他の方法はググってください

アップロードされたファイルの保存先(ファイルとして保存の場合)

store_dir メソッドを編集することによって、ファイルの保存先ディレクトリを指定できます。 public/ 以下の上記設定ディレクトリに保存されます。
上記の場合だと、rails_root/public/uploads/user/1/hoge.jpg とかそんな感じ。

ちなみに、ファイル名はアップロードされたファイル名のままです。


【4】RMagickのインストール・使い方

上記のサイトには apt-get で RMagick に必要な ImageMagick を入れられるとありますが、Ubuntu 12.04 では Can't find Magick-config とか言われて入れられません。

というわけで、別の方法で入れます。

参考サイト:Qiita「Ubuntu12.04でimage-magickとrmagickを入れる」

apt-get ではなく、aptitude で入れます。

$ sudo aptitude install imagemagick libimagemagick libmagickcore libmagickcore-dev libmagickwand-dev


RMagick を入れます。

$ bundle install

RMagick を有効にするには、利用するアップロードクラスの以下の行のコメントアウトを外します。
アップロードされた画像に対してサムネイルを自動作成するには、次のように記載します。 これで、画像ファイルがアップロードされたときに、100px×100px以内に縮小されたファイルが保存されます。

ファイル名は「thumb_元々のファイル名」になります。

ちなみに、表示するときは、 で表示できます。
スポンサーサイト

Rails model 階層化

Railsのモデルを自己階層化(?)したい場合――といってもたぶん伝わらないと思いますが、つまり、こういうこと↓

├机 ─デスク
├椅子┬スツール
│  └座椅子
└布団


階層の数が決まってれば、階層数だけテーブルとモデルを作ってリレーション設定してもいいんですが、スケーラビリティ的にあまり嬉しくない。
どうせ複数階層対応するなら、無限階層まで対応したい。

というわけで、CategoryモデルからCategoryモデルにリレーションを張って、自己階層化(?)したいわけです。


イメージとしてはこうですね↓

rails_root/app/model/category.rb
class Category < ActiveRecord::Base
belongs_to :category
has_many :categories
end

とはいえ、これだと動きません。


こういう状況を扱う方法はリファレンス本にも載っていなくて、必死にググった結果、見つけたのが下のページ。あなたが神か。

参考:日本の天ぷら情報「Railsで階層構造のデータを自力で扱う」

しかし、神も全能ではないらしく、うまく行かない点がいくつかあったので、そのあたりを書いておきます。

ちなみに、リンク先にもありますが、こういうデータ構造を「隣接リストモデル」とかって言うらしいです。ほへぇー。


【0】とりあえず、環境

Rails:3.2.0


【1】テスト用のアプリケーションの作成

テスト用のアプリケーションを作成します。

$ rails new tree_test
$ cd tree_test/
$ rails generate scaffold category name:string parent_id:integer
$ rake db:migrate



モデルを編集します。

rails_root/app/models/category.rb
class Category < ActiveRecord::Base
belongs_to :parent, class_name: Category, foreign_key: "parent_id"
has_many :children, class_name: Category, foreign_key: "parent_id"
end


これで、@category.name するのと同じように @category.parent.name したりできるようになります。

あと、@category.children.each とか。


ちなみに、冒頭の
├机 ─デスク
├椅子┬スツール
│  └座椅子
└布団
をこのモデルで表すと、
| id | name   | parent_id |
| 1 | 机    | nil |
| 2 | 椅子   | nil |
| 3 | 布団   | nil |
| 4 | デスク  | 1     |
| 5 | スツール | 2     |
| 6 | 座椅子  | 2     |
な感じになります。

Capistrano を使って Rails アプリケーションをデプロイする際に、Whenever も更新する

タイトルの通りですが、caistranoでcap deployしたときにwheneverも同時更新したい。

このときの設定方法。
初めは task を設定したりしてたんですが、その方法だと、デプロイするたびにcrontabの記載内容が増えていくという致命的な欠点が……w

参考サイト:CapistranoでWhenever|ひげろぐ

Rails デプロイ capistrano

Railsで作ったアプリケーションをデプロイしようとしたところ、いくつかエラーが発生したので記録を残しておく。


【1】Host key verification failed.

まずは、吐かれたエラー。長い。

$ cap deploy:migrations

** [host :: err] Host key verification failed.
** [ms0 :: err] fatal: The remote end hung up unexpectedly
command finished in 562ms
failed: "rvm_path=$HOME/.rvm/ $HOME/.rvm/bin/rvm-shell '1.9.3' -c 'if [ -d /home/user/host/shared/cached-copy ]; then cd /home/user/host/shared/cached-copy && git fetch -q origin && git fetch --tags -q origin && git reset -q --hard 18a1963df4f7e782b882abd949f2bf1984a7dbfa && git clean -q -d -x -f; else git clone -q user@host:git/application.git /home/user/host/shared/cached-copy && cd /home/user/host/shared/cached-copy && git checkout -q -b deploy 18a1963df4f7e782b882abd949f2bf1984a7dbfa; fi'" on host


Host Keyがどーのとか言われているが、SSH接続できることは既に確認済み。

というわけで、いろいろ調べた結果、Gitサーバーとデプロイ先が同じ時に発生するエラーらしいことが判明。

config/deploy.rbをいじります。

【訂正前】
set :deploy_via, :remote_cache

【訂正後】
set :deploy_via, :copy



【2】Could not find i18n-0.6.0 in any of the sources

*** [err :: ms0] rake aborted!
*** [err :: ms0] Could not find i18n-0.6.0 in any of the sources
*** [err :: ms0]
*** [err :: ms0] (See full trace by running task with --trace)
command finished in 862ms
failed: "rvm_path=$HOME/.rvm/ $HOME/.rvm/bin/rvm-shell '1.9.3' -c 'cd /home/user/host/releases/20120928063350 && rake RAILS_ENV=production RAILS_GROUPS=assets assets:precompile'" on host


別に国際化対応するほど立派なアプリケーションは作っていないので、i18nなんて使っていないにもかかわらず、i18nがないとか言われる。

i18nを入れたみたりいろいろした結果、以下の方法で解決。

config/deploy.rb
require 'bundler/capistrano'



【3】Access denied for user

*** [err :: ms0] rake aborted!
*** [err :: ms0] Access denied for user 'user'@'localhost' (using password: YES)
*** [err :: ms0]
*** [err :: ms0] Tasks: TOP => environment
*** [err :: ms0] (See full trace by running task with --trace)
command finished in 6407ms
failed: "rvm_path=$HOME/.rvm/ $HOME/.rvm/bin/rvm-shell '1.9.3' -c 'cd /home/user/host/releases/20120928064326 && bundle exec rake RAILS_ENV=production RAILS_GROUPS=assets assets:precompile'" on host



パーミッションとか言われて戸惑いましたが、冷静に考えると、デプロイ先のサーバーでデータベースの設定をしていないことに気づきました。

というわけで、

$ sudo mysql -u root -p
Enter password:
mysql> create database rails_production;
mysql> grant all privileges on rails_production.* to 'user'@'localhost' identified by 'password';
mysql> exit;


このあたりのユーザー名等はconfig/database.ymlに揃えれば大丈夫です。



以上3点のエラーをくぐり抜けた結果、無事デプロイすることができました。

Rails で MySQL に fixture を load すると文字化けする。

【環境】
Ruby: 1.9.3
Rails: 3.2.0
MySQL: 5.5

【0】問題

RailsでSQLite3を使って開発を進め、本番環境に移行しようと、production環境でのデータベースをMySQLに設定しました。

アプリケーションが正常に動作するかどうか確かめるために

$ rake db:fixtures:load RAILS_ENV="product"

して、フィクスチャデータを読み込んでみたところ、読み込み自体には成功したものの、フィクスチャデータ中の日本語がことごとく「?」になるという自体に。


【1】原因

いろいろ調べてみたところ、DBの文字コードに起因する問題っぽいことが判明。

【development】

$ rake db:carset
#=> UTF-8


【production】

$ rake db:carset RAILS_ENV="production"
# => latin1


つまり、SQLite3はUTF-8だが、MySQLはLatin-1で構成されている。

データベースの文字コードをUTF-8にして作成しなおせば解決しそう。


【2】解決法 => MySQLのデフォルト文字コード設定

Ubuntu では MySQL の設定ファイルは /etc/mysql/my.cnf にあります。

このファイルの [client], [mysqld] ブロックそれぞれに以下の行を追記します。

[client]
default-character-set=utf8
[mysqld]
character-set-server=utf8

(※ 古いMySQLは[mysqld]もdefault-character-set=utf8)

設定を有効にするために、MySQLを再起動。

$ sudo services mysql restart

これで、MySQLのデフォルト文字コードがUTF-8になります。

$ rake db:carset RAILS_ENV="production"
# => latin1
$ mysql -u root -p
Enter password: ********

mysql> status
--------------
mysql Ver 14.14 Distrib 5.5.24, for debian-linux-gnu (i686) using readline 6.2

Server version: 5.5.24-0ubuntu0.12.04.1 (Ubuntu)
Server characterset: utf8
Db characterset: utf8
Client characterset: utf8
Conn. characterset: utf8
--------------



DBを作りなおしてから、フィクスチャをロードしなおしたところ、アプリケーション側の表示も正常になっていました。


【3】結論

世界はUTF-8で廻れ!

Rails で has_secure_password を設定したときのパスワード認証

以前、書いたことがあるにも関わらず、すっかり忘れていたのでメモ。

app/models/user.rbにhas_secure_passwordを設定すると、パスワードがdigestとして保存されたり、editするときにconfirmが入ったりと、いろいろ便利になります。

しかし、digestとして保存されるため、ユーザーが入力したパスワードと保存されているパスワード(のdigest)が等しいのかを直接比較することができません。

というわけで、そんな場合の比較方法。

authenticateメソッドを使って比較します。
ちなみに、戻り値(返り値)について。
authenticateメソッドは引数がレシーバのパスワードと一致した場合にレシーバを返し、一致しなかった場合にfalseを返します。

Rails バッチ処理等のプログラムの書き方

Railsでバッチ処理などのMVCに直接関係してこないプログラムの書き方まとめメモ。

・Model, View, Controllerに関係しないプログラムはlibに入れる。
・libの中には任意の名前のディレクトリを入れて整理できる。
・libに置いた.rbファイルからはコントローラー等からと同様にデータベースにアクセスできる(例:「@hoges = Hoge.all」)
・libに置いたスクリプトをオートロードするためにはconfig/application.rbに以下の2行を追記する。

config.autoload_paths += %W(#{config.root}/lib)
config.autoload_paths += Dir["#{config.root}/lib/**/"]


・プログラムの実行は「rails runner Hoge.test」

以下の記事も参照。
whenever を使って Rails で cron 的な

whenever を使って Rails で cron 的な

Railsでcronのようなバッチ処理を行うためにwheneverを使ってみます。Railsのバージョンは3.2.0。

【1】バッチファイル作成

Railsではバッチファイルなどのプログラムはlib配下に置きます。

とりあえず、バッチファイルを作成。

$ nano lib/tasks/hoge.rb

このファイルにテスト用のプログラムを書いておきます。

class Hoge
 def self.test
  print "This is test!\n"
 end
end




【2】libディレクトリのファイルをオートロードするように設定

lib以下のファイルをオートロードするようにconfig/application.rbを設定します。Applicationクラスの中に次の記述を追記します。

module Hogehoge
 class Application < Rails::Application

  (中略)

  # Custom directories with classes and modules you want to be autoloadable.
  # config.autoload_paths += %W(#{config.root}/extras)
  config.autoload_paths += %W(#{config.root}/lib)
  config.autoload_paths += Dir["#{config.root}/lib/**/"]

  (中略)

 end
end

追記後、次のコマンドが通ってバッチファイルに記述したテキストが表示されれば問題なく設定できています。

$ rails runner Hoge.test
 # => This is test!




【3】wheneverの設定

Gemfileに以下の行を追記。

gem 'whenever', :require => false

そして、次のコマンドを実行。

$ bundle install
$ wheneverize .

wheneverの設定ファイルであるconfig/schedule.rbが作成されます。ピリオドを落とさないように注意。
続いて、生成されたconfig/schedule.rbを編集。

set :environment, :development
set :output, { :error => 'log/error.log', :standard => 'log/cron.log' }

every 1.minutes do
 runner "Sync.test"
end

設定内容を確かめるために

$ whenever

すると、設定されるcronが表示されます。
この時点ではcrontabに設定が反映されていないので、設定内容を確認して

$ xhenever --update-crontab

で反映します。
ちなみに、

$ xhenever --clear-crontab

でwheneverによる設定内容の取り消しができます。

これでwheneverによるcronの設定は完了です――が、ここでエラー発生。

正常に動作すれば、バッチ処理により、log/cron.logに「This is test!」と出力されるはずなのですが、出力が一切ない。
というわけで、エラーの出力先であるlog/error.logを見てみると

could not find bcrypt-ruby-3.0.1 in any sources (BundlerGemNotfound)

とか書かれている。

Gemfileをチェックしたところ、「gem 'bcrypt-ruby'」は書かれていたので、bundle installするが、既にインストール済み。

wheneverによってcrontabに設定されてたコマンド

$ /bin/bash -l -c 'cd /home/username/railsroot && script/rails runner -e development '\''Hoge.test'\'

を直接実行してみたところ、次のようなエラーを頂く。

Could not find bcrypt-ruby-3.0.1 in any of the sources
Run `bundle install` to install missing gems.


よくわからないが、Bundler的にはbcrypt-rubyが入っているのに、Ruby的にはそれを認識してないってこと?

Ruby及びRailsはRVM上で動かしているため、とりあえず、

$ rvm all do gem install bcrypt-ruby -v "3.0.1"

して、RVMのgemを読み直すためにターミナルを再起動して、再び

$ /bin/bash -l -c 'cd /home/username/railsroot && script/rails runner -e development '\''Hoge.test'\'

を実行したみたところ、エラーメッセージが

Could not find chronic-0.6.7 in any of the sources
Run `bundle install` to install missing gems.

に変化した。同様に

$ rvm all do gem install chronic --version "0.6.7"

して入れてみると、また別のgemが無いとか言われる。

しばらく

$ /bin/bash -l -c 'cd /home/username/railsroot && script/rails runner -e development '\''Hoge.test'\'
$ rvm all do gem install hogehoge --version "0.0.0"
$ exit

を繰り返すも、一向に終わる気配なし。

遅々として進まない状況に嫌気が差して、ダメ元でbundle installしてみたところ、いくつかのgemがインストールされた。

「初めにbundle installしたときには何も起こらなかったのに、なんだよおい、ぶつぶつ……」などと思いながら

$ /bin/bash -l -c 'cd /home/username/railsroot && script/rails runner -e development '\''Hoge.test'\'

してみると、エラーを吐かれない。
しばらく放置してcronの動作も確認してみるが、やはりエラーは吐かれない。

原因がわからなくて超気持ち悪いんですが、とりあえず動いたので良しとしておきます。
超気持ち悪いけど!


《参考サイト》
https://github.com/javan/whenever
http://www.slowlydays.net/wordpress/?p=707

『RailsによるアジャイルWebアプリケーション開発 第4版』 第16章 第2節 訂正

『RailsによるアジャイルWebアプリケーション開発 第4版』の『16.2 Capistranoによるリモートでのデプロイ』のコードがバージョン違いにより動かなかったので報告。

【0】問題

問題のコードはp.227のdeploy.rb。

deploy.rb を書籍通りに設定して、次のページに進み、

$ cap deploy:setup

すると、

RVM - Capistrano integration was extracted to a separate gem, install: `gem install rvm-capistrano` and remove the `$LOAD_PATH.unshift` line, note also the 'set :rvm_type, :user' is now the default (instead of :system). (RuntimeError)

なるエラーを吐かれます。

Google先生に聞いてみたところ、新しいRVMに起因するエラーみたいです。
とりあえず、解決をはかっていきます。


【1】gem「rvm-capistrano」を入れる

アプリケーションルートのGemfileに以下の行を追加します。

gem 'rvm-capistrano'

そして、

$ bundle install




【1】deploy.rbの修正

APP_ROOT/config/deploy.rb を修正します。
【修正前】

$:.unshift(File.expand_path('./lib', ENV['rvm_path']))
require "rvm/capistrano"
set :rvm_rub_string, '1.9.2'
set :rvm_type, :user

 ↑をこうします↓
【修正後】

require "rvm/capistrano"
set :rvm_ruby_string, '1.9.2'


これで正常に動作し、cap deploy:setup が通るようになりました。

ただ、解決までにかなり時間がかかり、ここに書いていないこともいろいろ試したので、もしかすると上記の方法だけでは解決しないかもしれません。その際はごめんなさいw

Rails で実行環境をプログラム側から取得

Railsで実行環境(test/development/production)を取得するには、ENV['RAILS_ENV'] を用います。

ヘッダやサイドバーに

<% unless ENV['RAILS_ENV'] == "production" %>
 <%= ENV['RAILS_ENV'] %>
<% end %>

とか書いておくと、今見ているアプリケーションがどの環境で実行されているのか一目でわかって便利かも。

『RailsによるアジャイルWebアプリケーション開発 第4版』 第16章 第1節 補足

Railsの勉強に使わせていただいている『RailsによるアジャイルWebアプリケーション開発 第4版』ですが、わかりにくい場所が何箇所かあります。
いや、すべての環境をカバーするのが無理なのはわかってるんですが。

とはいえ、本だけ見ててもサクッと進めないのは事実なので、また、この章(『16.1 Phusion PassengerとMySQLを使ったデプロイ』)はわかりにくい場所が特に多いので、自分の環境で気になったところを簡単に補足しておきます。

【環境】
Ubuntu 12.04
Apache 2.2.20
ruby 1.9.2p320
Rails 3.1.0


【1】p.219「Passengerのインストール」

Passengerのインストールに絡んで、apacheの設定をいじるあたりで、

$ apache -V | grep HTTPD_ROOT
$ apache -V | grep SERVER_CONFIG_FILE

して設定ファイルの場所(/etc/apache2/apache2.conf)を調べ、設定ファイルの「Listen 80」の後ろに

NameVirtualHost *:80

と書き込めというくだりがあるんですが、apache2.confをいくら探しても「Listen 80」が見つかりません。

というのも、Debian/Ubuntuではこのapache2.confとは別に/etc/apache2/ports.confという設定ファイルがあり、ここにポート関連の設定を書き込むみたいなので、このファイルを書き換えてください。
(ただし、ports.confには既に「NameVirtualHost *:80」が書き込まれていると思います)


【2】p.220「ローカルでのアプリケーションのデプロイ」

このセクションでも

<VirtualHost *:80>
 ServerName hostname
 DocumentRoot /home/username/work/depot/public/
 <Directory /home/username/work/depot/public>
  AllowOverride all
  Options -MultiViews
  Order allow,deny
  Allow from all
 </Directory>
</VirtualHost>

などという設定を書き込めと言われますが、どの設定ファイルに書き込めば良いのかが書かれていない。

普通ならapache2.confしかないので大丈夫なんでしょうが、Debian/Ubuntuの場合、この設定もports.confに書き込みます。

この状態でapacheをrestartしてページにアクセスすると「We're sorry, but something went wrong.」というページが表示され、production環境でアプリケーションが動きません。

ちなみに、これはアプリケーションのpublicディレクトリに入っている500.htmlが表示されている状態です。
試しに、適当に作ったindex.htmlをpublicディレクトリに置いてみると、その内容が表示されるのがわかります。

また、ports.confに「RackEnv development」を追加してみると、development環境のアプリケーションが起動します。

いろいろググってみると、偉大なる先人の記事にヒット。
http://d.hatena.ne.jp/tetsuyai/20110920/1316504421

要するにRails 3.1のバグ(?)で、config/evironment/production.rbまわりの設定が原因みたい。

# Don't fallback to assets pipeline if a precompiled asset is missed
config.assets.compile = true

config.assets.compileの値をfalseからtrueに変更すればproduction環境でアプリケーションが起動します。


【3】p.221「MySQLデータベースの利用」

まずはじめに、mysql2のgemをインストールするところ。
書籍に書かれている通りにGemfileを設定してアプリケーションディレクトリで

$ bundle install

を実行すると、gem管理ツールであるbundlerがGemfileに書かれたgemをインストールしてくれます。

また、p.222の

$ mysql -u root

に関してですが、MySQLインストール時(書籍で言うとかなり初めの頃)にパスワードを設定した場合、

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

というメッセージと共に弾かれます。

$ mysql -u root -p

とすれば、コマンド実行直後にパスワードを尋ねられるので、その際に以前設定したパスワードを入力してください。

また、その先のdatabase.ymlの場所は、アプリケーションディレクトリのconfig/database.ymlにあります。
なお、YAMLファイルのインデントにタブは使えないので、半角スペースでインデントしてください。

『RailsによるアジャイルWebアプリケーション開発 第4版』 第10章 第3節 誤植

Rails の勉強に使っている『Rails によるアジャイル Web アプリケーション開発 第4版』の第10章 第3節(10.3 カートの仕上げ)に誤植があったので、報告しておきます。

P.119 最下部に書いてあるテストコードを書かれたとおり実行すると、以下のエラーが出て、テストが通りません。

【エラー例】

FAIL should destroy cart (0.07s)
  "Cart.count" didn't change by -1.
<1> expected but was
<2>.
  /home/ubuntu/.rvm/gems/ruby-1.9.2-p320/gems/activesupport-3.1.0/lib/active_support/testing/assertions.rb:60:in `block in assert_difference'



【誤】
test/functional/carts_controller_test_rb

test "should destroy cart" do
assert_difference('Cart.count', -1) do
  delete :destroy, {id: @cart.to_param}, {cart_id: @cart.id}
 end

 assert_redirected_to store_path
end


【正】
test/functional/carts_controller_test_rb

test "should destroy cart" do
 assert_difference('Cart.count', -1) do
  session[:cart_id] = @cart.id
  delete :destroy, id: @cart.to_param
 end

 assert_redirected_to store_path
end



※注意※
 上記のサンプルはインデントを表現するために全角スペースを使っています。

バージョン違いってことですか。

山田祥寛『Ruby on Rails 3 アプリケーションプログラミング』を使ってRailsの勉強をしていますが、結構使用が変わってるみたいで、困る。

フィクスチャでテストデータを流し込もうと、

$ rake db:fixtures:load FIXTURES=books.yml



すると、エラー。

いろいろ試してみた結果、正しくはこうらしい。

$ rake db:fixtures:load FIXTURES=books



はい、拡張子がいらなかったっていうね。

というわけで、Railsはわりと頻繁に仕様変更するっぽいのでご注意ください。
まあ、本に書いてあるバージョンにしない俺が悪いんですけどw

RoR Rake db::migrate できない。

やっと動くようになったRails上にマイグレーションファイルでテーブルを作ろうとすると、エラー発生。

$ rake db:migrate
(in /home/user/rails)
rake aborted!
uninitialized constant Rake::DSL
/home/user/rails/Rakefile:7
(See full trace by running task with --trace)



ググるとここに行き着いた。

http://d.hatena.ne.jp/nayuko22/20110728/1311837082

書かれている通り、Rakefileをエディタで開いて、require 'rake/dsl_definition'を追記。

Rakefile

#!/usr/bin/env rake
# Add your own tasks in files placed in lib/tasks ending in .rake,
# for example lib/tasks/capistrano.rake, and they will automatically be availab$

require File.expand_path('../config/application', __FILE__)
require 'rake/dsl_definition'

Railbook::Application.load_tasks



「この定数はすでに定義されてるよ☆」と警告されるが、とりあえず動くので見なかったことにして終了。

Ruby on Rails ようやく rails server できるように!

【環境】
Ubuntu 11.10
Rails 3.2.3

前回、なんとかかんとかRailsをインストールできたので、喜び勇んで

$ rails new test



と実行したところ、

Invalid gemspec in [/var/lib/gems/1.8/specifications/sass-rails-3.2.5.gemspec]: invalid date format in specification: "2012-03-19 00:00:00.000000000Z"
(中略)
Could not find jquery-rails-2.0.2 in any of the sources
Run `bundle install` to install missing gems.



といったエラーが発生。
言われたとおりに bundle install してみたところ、bundle入ってないよ! と怒られたので、言われたとおりにインストールして、もう一度 bundle install。

$ sudo apt-get install ruby-bundler
$ bundle install
Invalid gemspec in [/var/lib/gems/1.8/specifications/sass-rails-3.2.5.gemspec]: invalid date format in specification: "2012-03-19 00:00:00.000000000Z"
(中略)
Could not find jquery-rails-2.0.2 in any of the sources
Run `bundle install` to install missing gems.
(中略)
Your bundle is complete! Use `bundle show [gemname]` to see where a bundled gem is installed.



日付の形式がどーのこーのというメッセージが気になるが、completeと出たので意気揚々と rails server してみる。

$ rails server
Invalid gemspec in [/var/lib/gems/1.8/specifications/sass-rails-3.2.5.gemspec]: invalid date format in specification: "2012-03-19 00:00:00.000000000Z"
(中略)
Could not find jquery-rails-2.0.2 in any of the sources
Run `bundle install` to install missing gems.



おい、bundle install しただろ……orz
というわけで、とりあえず、エディタで日付の形式を修正して、再び rails server してみると、またしてもエラー。

$ rails server
/var/lib/gems/1.8/gems/execjs-1.3.0/lib/execjs/runtimes.rb:50:in `autodetect': Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)



なんかもう訳わからないので、必死ににググる。
結果、下のサイトを発見。

http://shun-ichiro.blogspot.jp/2011/12/rorrails-server.html

リンク先のサイトに書かれているとおりに、Gemfileに

require 'therubyracer'



を書き加えて、再び bundle installすると、いろいろ言われます。
(ちなみに、Gemfile は rails new で作ったフォルダにあるものです。「Gemfileってどこー!?」と find / -name Gemfile とかすると大変なことになるので注意w)

$ bundle install
(中略)
Invalid gemspec in [/var/lib/gems/1.8/specifications/libv8-3.3.10.4-x86-linux.gemspec]: invalid date format in specification: "2011-11-15 00:00:00.000000000Z"
Invalid gemspec in [/var/lib/gems/1.8/specifications/libv8-3.3.10.4-x86-linux.gemspec]: invalid date format in specification: "2011-11-15 00:00:00.000000000Z"
Invalid gemspec in [/var/lib/gems/1.8/specifications/libv8-3.3.10.4-x86-linux.gemspec]: invalid date format in specification: "2011-11-15 00:00:00.000000000Z"
Could not find gem 'therubyracer (>= 0)' in any of the gem sources listed in your Gemfile.
Run `bundle install` to install missing gems.



いろいろ言われますが、とりあえず簡単に修正できそうな上記の部分から修正して、bundle install すると、

Your bundle is complete! Use `bundle show [gemname]` to see where a bundled gem is installed.



喜び勇んで、rails server!

$ rails server
=> Booting WEBrick
=> Rails 3.2.3 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2012-04-16 17:13:09] INFO WEBrick 1.3.1
[2012-04-16 17:13:09] INFO ruby 1.8.7 (2011-06-30) [i686-linux]
[2012-04-16 17:13:09] INFO WEBrick::HTTPServer#start: pid=5830 port=3000



というわけで、とりあえず無事動きました。

Ubuntu Ruby on Rails 入らない

サーバーにRailsを入れようと、以下のコマンドを入力。

$ sudo gem install rails

Successfully installed rails-3.2.3



余裕だぜ! と思っていたのも束の間。

$ rails -v
The program 'rails' is currently not installed. You can install it by typing:
sudo apt-get install rails



……なんでだよ。

ここで再インストールしてみたり、gemを入れなおしてみたり、apt-getで入れてみたり、数時間ハマった結果、下のサイトに行き着きました。

http://d.hatena.ne.jp/satake7/20080219/1207895317

というわけで、シンボリックリンクを貼ってとりあえず解決。

$ sudo ln -s /var/lib/gems/1.8/bin/rails /usr/bin/rails

$ rails -v
Rails 3.2.3

カレンダー
07 | 2017/08 | 09
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -
検索フォーム
カテゴリ
月別アーカイブ
最新記事
最新コメント
最新トラックバック
RSSリンクの表示
QRコード
QR
リンク
アクセス解析
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。