Ruby on Rails (3.x >= 3.2.9) のためのブログです (どっちかというと社内ブログ的な感じで、基礎から書いてきます) 。
Comments


Railsで、「ファイルをアップロードし、そのファイルのパスをデータベースに保存する」という処理を行いたい場合、CarrierWave を使えばできます。

① CarrierWave をインストール


まず、Gemfileに以下を追加
gem 'carrierwave' # これを追加
次に、以下のコマンドを実行

$ bundle install



② アップロード用のクラスを作成する

$rails generate uploader image

このコマンドを実行すると、app/uploaders/image_uploader.rb (ImageUploaderクラス) が作成されます


③ 画像アップロード用に、モデルを定義


images というテーブル (モデルはImage) に、imagename というカラム名で、ファイル名を管理するとします。


つまり、imagename は string型 としてmigrationしてあげればOKです。


このテーブルに対するモデルを以下のように定義します。
class Image < ActiveRecord::Base
  attr_accessible :imagename
  mount_uploade :imagename, ImageUploader
end
これで、アップロード成功時に同時にDBへの保存も行われるようになります。


④ 実際にアップロードしてみる


ほとんどの解説ブログなどでは、モデルと結びついたフォーム (form_for) を利用しているので、ここでは、そうでない場合のやり方で書いてます (form_tag利用)
コントローラーは以下
class UploadTestController < ApplicationController
  def upload
    unless params[:photoname].nil? then
      image = Image.new
      image.imagename = params[:imagename]
      image.save # ここでアップロード処理とDB保存処理が走る
    end
  end
end
ビューは以下 (upload.html.erb)
<%= form_tag  '/upload_test/upload/', :multipart => true do %>
<%= file_field_tag :photoname %>
<%= submit_tag 'upload' %>
<% end %>
これでOKです。
[...]

Categories: , , ,
Comments


ポリモーフィック関連について、今回は解説します。
まず、ポリモーフィック関連とは、以下の図に示すように、type によってリレーション先の親モデルが変わるようなものと子の関係です。



Rails では、***_id (int)と、***_type (string(255)) によって、これを実現しています。

このようなデザインのDB設計をしてる場合の、MigrationファイルやModelの作成方法は以下のようになります。

① ポリモーフィック関連のテーブルのMigrationファイル


class CreateItems < ActiveRecord::Migration
  def change
    create_table :items do |t|
      t.references :itemable, :polymorphic => true # この部分
    end
  end
end

② ポリモーフィック関連のModel


Itemモデル
# Item Model
class Item < ActiveRecord::Base
  belongs_to :itemable, :polymorphic => true # この部分
end
Restaurantモデル
# Restaurant Model
class Restaurant < ActiveRecord::Base
  has_many :items, :as => :itemable # この部分
end
Storeモデル
# Store Model
class Store < ActiveRecord::Base
  has_many :items, :as => :itemable # この部分
end

このように、itemable というポリモーフィック関連用のモデルのようなものを定義し、そいつに対して子と親からリレーションを張る感じです。
その際に、子には :polymorphic => true, 親には :as => :itemable を記述します。


③ ポリモーフィック関連のFixture


次に、テストデータの作成のために。Fixtureファイルの記述法を書きます。(以下)
item1:
  itemable: store1 (Store)
item2:
  itemable: restaurant1 (Restaurant)
※ store1 と restaurant1 のラベルが定義されている仮定です。


これでOKです。
[...]

Categories: , ,
Comments


Model, View, Controller のフレームワークに、サービス層を付け加えたほうがいいのでは〜?という記事をこの前書きました。

RAILSでのアプリケーション作成 - MVC

そこで、

  • app/services 以下に指定した名前のサービスクラスを作成
  • test/unit 以下に作成したサービスに対するTest用クラスを作成
以上の機能を持ったrakeコマンドを作成しました。
以下のスクリプトを, lib/tasks の中に作成してください (ファイル名は service.rake)



# encoding: utf-8
# サービスクラスを作成する
# app/services以下
#
# rake service:create SERVICE="hoge"
#   このコマンドで、app/services/hoge_service.rbが作成 class名はHogeService
namespace :service  do

  # service ファイルの作成
  task :create do
    service_file_name = ENV['SERVICE'].to_s

    if service_file_name != "" and File.extname(service_file_name).empty? then

      service_file_name = service_file_name + "_service"
      services_dir = File::expand_path('./app/services');

      # services ディレクトリがなかったら作成
      FileUtils.mkdir_p(services_dir) unless FileTest.exist?(services_dir)

      service_file_path = services_dir + "/" + service_file_name + ".rb"
      classname = convert_to_camelcase(service_file_name)

      if make_service_class(classname, service_file_path) then
        print "\e[34m" + "app/services/" + service_file_name + ".rb\e[0m" + "を作成しました。\n"

        # UnitTest用のクラス作成
        test_services_dir = File::expand_path('./test/unit');
        test_service_file_path = test_services_dir + "/" + service_file_name + "_test.rb"

        if make_service_test_class(classname, test_service_file_path) then
          print "\e[34m" + "test/unit/" + service_file_name + "_test.rb" + "\e[0m" + "を作成しました。\n"
        end

      else
        print "\e[41m" + "既に指定したサービスが存在しています。" + "\e[0m\n"
      end
    else
      print "\e[41m" + "正しい SERVICE パラメータを指定して下さい。" + "\e[0m\n"
    end
  end

  def convert_to_camelcase(str)
    return str.split('_').map{|s| s.capitalize}.join('')
  end

  def make_service_class(service_class_name, filepath)

    if !FileTest.exist?(filepath) then

      test_program = <<EOS
# encoding: utf-8

class %%CLASS_NAME%%
end
EOS
      test_program = test_program.sub("%%CLASS_NAME%%", service_class_name)
      f = open(filepath, "w")
      f.write(test_program)
      f.close()

      return true

    else
      return false
    end
  end

  def make_service_test_class(service_class_name, filepath)
    if !FileTest.exist?(filepath) then
      test_program = <<EOS
# encoding: utf-8

class %%CLASS_NAME%%Test < ActiveSupport::TestCase
end
EOS
      test_program = test_program.sub("%%CLASS_NAME%%", service_class_name)
      f = open(filepath, "w")
      f.write(test_program)
      f.close()

      return true

    else
      return false
    end
  end
end



このファイルを作成し、

$ rake service:create SERVICE="hoge_hoge"


とすれば、

  • app/services/hoge_hoge_service.rb が作成されます。 
  • 同時に、test/unit/hoge_hoge_service_test.rb が作成されます。 

ちょー適当に作りましたが、メモ残しておきます。 ノリで、rakeの独自タスクの作成テストとして作っただけなので、めちゃくちゃ汚いソースコードですが勘弁して下さい。。。すいません。。。


[...]

Categories: , , , ,
Comments


独自の rakeタスクを作成するには、以下の手順を。

① lib/tasks の中に、hoge.rake を作成


例えば、以下の様なファイルを作成します
# lib/tasks/hoge.rake
namespace :hoge  do
  task :piyo do
    # ENV['opt'] で、rake hoge:piyo opt="[文字]" で指定した[文字]の部分を取得できます
    # ここに実行したい処理を記述
  end
end


② rakeコマンド実行


あとはコマンドを実行するだけ
$ rake hoge:piyo opt="オプション"
[...]

Categories: , , ,
Comments


Rails3 において、Pagenation 処理を行う場合、Kaminari という gem を使うのが良さそうです。Kaminari については、[ コチラ : Kaminariの使い方 Rails3時代のpaginationの標準候補 ] の記事にとてもわかり易くまとめられていました。

① gem でインストール
$ gem install kaminari

② Gemfile に以下を記述。
gem 'kaminari'
③ コマンド実行
$ bundle install


使い方は先程の参考サイトを。
[...]

Categories: , , ,
Comments


Rails は MVCのフレームワークで、
  • Model : ビジネスロジックを書く場所
  • View : データを、ユーザーにどんな形で見せるかを記述
  • Controller : ユーザーの操作に対して、Modelをコントロールする
部分に分かれています。

ちなみに、そもそもMVCフレームワークの元の概念は....とかのMVC論争には、そこまで触れる気はありません。。

Railsでアプリケーションを作成する際には、この MVC に沿って開発をするのですが、その際に注意することや、自分が開発する上での方針を書いておく。(何がよくて何が悪いというより、ただのメモとして見てくれたら嬉しいです)

  • Controllerはできるだけ薄くする
  • ビジネスロジックなどはModelに記述する
  • ( Helperで、Modelをあつかっても良い。それで逆に複雑化するならやめておく )
  • 複数のModelにまたがるような処理だとかは、Service層を作るのもありかも (app/services や、app/models/services の作成) ちなみにGrailsでは、service層がフレームワークとして組み込まれてるらしいです。ただ、あくまでもビジネスロジックとなる部分はModelに記述すること。Serviceは「手続き」の部分を担当
  • 当たり前だけど、UnitTest はちゃんとしようww


こんなとこです。なんかもっとこうした方がいいよ!みたいな意見があれば欲しいです。





[...]

Categories: , , , , ,
Comments

Unit Testは、以下のコマンドで実行できます。
# test/units 以下ファイルすべてをテスト
$rake test:units
# 指定したファイルのみテスト
$rake test:units TEST=[テストするスクリプトへのパス]


① まず最初にテスト用のデータベースを作成


# 現在のschema.rbの情報をもとにテストDB作成
$ rake db:test:load
# テストDBの削除は以下のコマンド
$ rake db:test:purge
# (他にもいくつか作成用コマンドがあります)

ちなみに、texture で記述したテストデータが展開されます。


② テストの内容を作成


たとえば、userモデルのスクリプトのテストをしてみることにします。
そのために、まずテスト用のスクリプトを編集します。model を作成した際に、test/unit 以下に user_test.rb が作成されているはずです。デフォルトでは以下の様なコードになっています。
# test/unit/user_test.rb
require 'test_helper'

class UserTest < ActiveSupport::TestCase
  # test "the truth" do
  #   assert true
  # end
end

これを、編集します (例えば以下)
# test/unit/user_test.rb
require 'test_helper'

class UserTest < ActiveSupport::TestCase
  
  def setup
    # テストメソッドの実行前に行いたい内容を記述
    # texture の読込のような、リソースの初期化など
    # e.g.) @u = users(:user1)
  end

  def teardown
    # テストメソッドの実行後に行いたい内容を記述
    # リソースの破棄など
    # e.g.) @u = nil
  end

  test "user save" do
    user = User.new({
      :name => 'ユーザー1',
      :email => 'test@example.com'
    })
    assert user.save, "ユーザーの保存に失敗しました"
  end
end
※1 ここで、test の後の "user save" はテストの名前で、一意な名前で指定
※2 setup は、テストメソッドの実行前に呼び出される
※3 teardown は、テストメソッドの実行後に呼び出される

assert文は、処理結果が正しいかチェックするためのメソッドです。
様々な種類のチェック用メソッドがありますが、それは[ユニットテストで使うメソッド | Railsドキュメント]を参考にすると良いと思います。


③ テストを実行


この様に、テストスクリプトを書いたら、冒頭に記述したコマンドを打てばテストを実行できます。
$rake test:units TEST=test/unit/user_test.rb
[...]

Categories: , , , ,
Comments

データベースにテストデータを入れたい場合、fixture というものを使用します。

以下の様に model を作成した場合、test/fixtures 以下に、xxx.yml が作成されます。
$ rails generate model user
      invoke  active_record
      create    db/migrate/20121204111949_create_users.rb
      create    app/models/user.rb
      invoke    test_unit
      create      test/unit/user_test.rb
      create      test/fixtures/users.yml
このファイル (test/fixtures/users.yml) に、テストデータを記入します。

以下がその例

# test/fixtures/users.yml
<% 1.upto(3) do |n| %>
user<%= n %>:
  name: ユーザー<%= n %>
<% end %>

また、アソシエーションで外部キーを設定したい場合は、結び付けたいデータのラベル名を指定します。
# test/fixtures/articles.yml
<% 1.upto(3) do |n| %>
<% 1.upto(5) do |m| %>
article<%= n %>-<%= m %>:
  user: user<%= n %> #user1ラベルを指定
  name: 記事<%= m %>
<% end %>


また、この様に外部キーを設定する場合、model に リレーションの設定をしなければなりません (めっちゃハマった.........(´;ω;`)ブワッ)

この場合は、
# models/article.rb
class Article < ActiveRecord::Base
  belongs_to :user # この記述が必要!!
end
のように、belongs_toを指定します。

この様にして、fixtureファイルを作成したら、rake db:fixtures:load コマンドを実行
$ rake db:fixtures:load

これでテストデータが挿入されます。
[...]

Categories: , , , ,
Comments


Ruby on Rails 3 ポケットリファレンス [単行本(ソフトカバー)] 山田 祥寛 (著)


13年のロングセラーシリーズ・ポケットリファレンスにWebアプリケーションフレームワークの新定番であるRails3が新登場。逆引き形式で目的の情報をすぐ探せて、サンプルコードを見ながら具体的な実装のイメージがつかめます。Rails3.1以降に対応、標準ライブラリとなったjQueryやCoffeeScriptの話題もフォローしています。定番解説書である『Ruby on Rails 3 アプリケーションプログラミング』の著者・山田祥寛氏による、現場で役立つ信頼の1冊。

とりあえず、この書籍オススメです。

Rails でやりたいことを簡単に検索できるし、かつ解りやすいため、最初に何か本を買って Rails を勉強したい!!ってひとにはこの本で十分じゃないかと思います。
[...]

Categories: , ,
Comments


Railsでトランザクション処理を実装する場合、その機能をActiveRecordが用意してくれています。 transaction do ..... end を使用すればOKなのです。

def hoge
  User.transaction do
    user1 = User.new
    user1.save! # save!メソッドは保存できない場合、例外ActiveRecord::RecordInvalidが発生

    user2 = User.new
    user2.save!

  end
  #例外が発生しなかった場合の処理
  render :text = "成功"

  rescue => e
  #例外が発生した場合の処理
  render :text = "失敗"
end

自動でロールバックしてくれます。

[...]

Categories: , ,
Comments


Rails で CSRF(クロスサイトリクエストフォージェリ) の対策を行う場合、
コントローラーで protect_from_forgery を、テンプレートで csrf_meta_tag を使用します。
そして、formを作成する時に、ビューヘルパーを利用してフォームを作成すればOKです(form_for / form_tag など)

以下、参考サイトです。


[...]

Categories: , ,
Comments

Rails のサーバーは以下のコマンドで起動できます。
$ rails server [name] [options]

[name]
mongrelやthinなど (WEBrick以外を指定したい場合のみ指定)

[options]
-p [portnum], --port=[portnum] ポート番号 デフォルト : 3000
-b [ipAddr], --binding=[ipAddr] バインドするIPアドレス デフォルト : 0.0.0.0
-d, --deamon デーモンとして起動する デーモンとして起動したrailsサーバーを停止する場合は、ps -ef | grep script/rails でプロセスを確認し、kill -9 [processID] を行う
-e [env-name], --enviroment=[env-name] 環境の指定 (production, development, test のどれか) デフォルト : development

これでサーバーを起動できます。
[...]

Categories: , , ,
Comments

model のアクセサメソッドについてメモメモ。

class User < ActiveRecord::Base
  attr_accessor :name
end

このように、Model に アクセサメソッドを定義して、

user = User.new
user.name = "名前"
user.save

のようにして永続化をしようとしたが、name カラムの値がDBに保存されなかった。
ActiveRecord を継承してるので、そのActiveRecord 側がなんかしちゃうのかな。。。

ちょっと詳しく調べる時間ないので、後回しですが、attr_accessor の記述を消して普通に
user = User.new
user.name = "名前"
user.save
をやるだけでいけました。
[...]

Categories: , ,
Comments

Model では、attr_accessible と attr_protected というクラスメソッドがあります。 これらについて。
class User < ActiveRecord::Base
  attr_accessible :name, :email
  attr_protected :id
end

attr_accessible は、代入を許されている (publicのの様なもの) カラムで、attr_protected は、代入を許さない (newや@params['user']['name'], attribute=.. のようなもの) カラムを指定するもの。

attr_accessible に指定しないものは、 attr_protected になる様です。
ちなみに、メソッドを介してのカラムの値の変更は大丈夫です。
[...]

Categories: , , ,
Comments


Ruby の コーディング規約に関しては、以下の記事を参考にするとよさそうです。



備考:

  • rubyはメソッド呼び出しの際に括弧を省略できるが、p や attr_accessor など慣例的に丸括弧を省略する場合以外、丸括弧を書く
  • 一応、rdocに沿ったコメントを書く

など、意識してけばいいのではないでしょうか。



[...]

Categories: , ,
Comments


migrationファイル (db/migration 以下) は、[タイムスタンプ]_create_users.rb の様に、タイムスタンプがファイル名の先頭についています。

このファイルは、以下のコマンドを利用すれば簡単に作成できます。

$ rails generate migration [hogehoge]
    invoke  active_record
    create    db/migrate/20121206214547_[hogehoge].rb

[hogehoge] に指定した文字列とタイムスタンプをつなげた名前のファイルが、db/migrate 以下に作成されます。

※ rails generate model [mogera]
のように、model を作成した場合は、rails generate migration create_[mogera] としたのと同じ、20121204111949_create_users.rb のようなファイルが作成されます。
[...]

Categories: , , , , ,
Comments

Javaには JavaDocとよばれる、JavaのソースコードからHTML形式のAPI仕様書を作成してくれるものがありますよね。

①ドキュメントの生成方法・コマンド


ruby では RDoc と呼ばれるものがあります。
今回は Rails で RDocを使用する方法を書いておきます。
# 現在のアプリのドキュメントファイルを作成する
$ rake doc:app

# アプリのドキュメントファイルを削除する
$ rake doc:clobber_app

# 現在あるドキュメントを強制的に上書きする
$ rake doc:reapp


# railsに関するドキュメントを作成する
$ rake doc:rails

ほかは [ rakeのタスク一覧 ] に書いてあるので見てみて下さい。



②RDoc の書き方


次に, RDoc の書き方については、以下の記事が参考になります。

どうせコメントを書くなら、少し RDoc を意識して書くと後々よさげ





[...]

Categories: , , ,
Comments

以下のコマンドで、一覧を見れます。
$ rake -T
rake about                          # List versions of all Rails frameworks and the environment
rake assets:clean                # Remove compiled assets
rake assets:precompile       # Compile all the assets named in config.assets.precompile
rake db:create                     # Create the database from DATABASE_URL or config/database.yml for the current Rails.env (use db:create:all to create all dbs in the config)
rake db:drop                       # Drops the database using DATABASE_URL or the current Rails.env (use db:drop:all to drop all databases)
rake db:fixtures:load           # Load fixtures into the current environment's database.
rake db:migrate                   # Migrate the database (options: VERSION=x, VERBOSE=false).
rake db:migrate:status        # Display status of migrations
rake db:rollback                   # Rolls the schema back to the previous version (specify steps w/ STEP=n).
rake db:schema:dump         # Create a db/schema.rb file that can be portably used against any DB supported by AR
rake db:schema:load           # Load a schema.rb file into the database
rake db:seed                        # Load the seed data from db/seeds.rb
rake db:setup                      # Create the database, load the schema, and initialize with the seed data (use db:reset to also drop the db first)
rake db:structure:dump       # Dump the database structure to db/structure.sql. Specify another file with DB_STRUCTURE=db/my_structure.sql
rake db:version                    # Retrieves the current schema version number
rake doc:app                       # Generate docs for the app -- also available doc:rails, doc:guides, doc:plugins (options: TEMPLATE=/rdoc-template.rb, TITLE="Custom Title")
rake log:clear                      # Truncates all *.log files in log/ to zero bytes
rake middleware                  # Prints out your Rack middleware stack
rake notes                          # Enumerate all annotations (use notes:optimize, :fixme, :todo for focus)
rake notes:custom             # Enumerate a custom annotation, specify with ANNOTATION=CUSTOM
rake rails:template              # Applies the template supplied by LOCATION=(/path/to/template) or URL
rake rails:update                 # Update configs and some other initially generated files (or use just update:configs, update:scripts, or update:application_controller)
rake routes                         # Print out all defined routes in match order, with names.
rake secret                         # Generate a cryptographically secure secret key (this is typically used to generate a secret for cookie sessions).
rake stats                          # Report code statistics (KLOCs, etc) from the application
rake test                            # Runs test:units, test:functionals, test:integration together (also available: test:benchmark, test:profile, test:plugins)
rake test:recent                 # Run tests for {:recent=>"test:prepare"} / Test recent changes
rake test:single                  # Run tests for {:single=>"test:prepare"}
rake test:uncommitted      # Run tests for {:uncommitted=>"test:prepare"} / Test changes since last checkin (only Subversion and Git)
rake time:zones:all             # Displays all time zones, also available: time:zones:us, time:zones:local -- filter with OFFSET parameter, e.g., OFFSET=-6
rake tmp:clear                    # Clear session, cache, and socket files from tmp/ (narrow w/ tmp:sessions:clear, tmp:cache:clear, tmp:sockets:clear)
rake tmp:create                  # Creates tmp directories for sessions, cache, sockets, and pids

でも、実際は rake db:migrate:reset など、他にもコマンドがあるんですが、この中には載ってないようです。。。。。
全部観たい!!と思ってたのですが、よく調べ方がわかりませんでした。。。


description が載っていないのでよければ、以下のコマンドで調べれらます。

$ rake -P | grep rake
rake about
rake assets:clean
rake assets:clean:all
rake assets:environment
rake assets:precompile
rake assets:precompile:all
rake assets:precompile:nondigest
rake assets:precompile:primary
rake db:_dump
rake db:abort_if_pending_migrations
rake db:charset
rake db:collation
rake db:create
rake db:create:all
rake db:drop
rake db:drop:all
rake db:fixtures:identify
rake db:fixtures:load
rake db:forward
rake db:load_config
rake db:migrate
rake db:migrate:down
rake db:migrate:redo
rake db:migrate:reset
rake db:migrate:status
rake db:migrate:up
rake db:reset
rake db:rollback
rake db:schema:dump
rake db:schema:load
rake db:schema:load_if_ruby
rake db:seed
rake db:sessions:clear
rake db:sessions:create
rake db:setup
rake db:structure:dump
rake db:structure:load
rake db:structure:load_if_sql
rake db:test:clone
rake db:test:clone_structure
rake db:test:load
rake db:test:load_schema
rake db:test:load_structure
rake db:test:prepare
rake db:test:purge
rake db:version
rake default
rake doc
rake doc/api
rake doc/api/index.html
rake doc/app
rake doc/app/index.html
rake doc:app
rake doc:clobber
rake doc:clobber_app
rake doc:clobber_plugins
rake doc:clobber_rails
rake doc:guides
rake doc:plugins
rake doc:rails
rake doc:reapp
rake doc:rerails
rake environment
rake log:clear
rake middleware
rake notes
rake notes:custom
rake notes:fixme
rake notes:optimize
rake notes:todo
rake rails:template
rake rails:templates:copy
rake rails:update
rake rails:update:application_controller
rake rails:update:configs
rake rails:update:scripts
rake rails_env
rake railties:install:migrations
rake routes
rake secret
rake stats
rake test
rake test:benchmark
rake test:functionals
rake test:integration
rake test:plugins
rake test:prepare
rake test:profile
rake test:recent
rake test:run
rake test:single
rake test:uncommitted
rake test:units
rake time:zones:all
rake time:zones:local
rake time:zones:us
rake tmp:cache:clear
rake tmp:clear
rake tmp:create
rake tmp:pids:clear
rake tmp:sessions:clear
rake tmp:sockets:clear


こんな感じですね。
ちなみに Rails 3.2.9 です。どっかのバージョンでは、rake -T で全部見れたらしいのですが。。いちおうそれが載ってる記事があったので、紹介します。

rake --helpとrake -Tの実行結果 ]

以上〜。



[...]

Categories: , , ,
Comments

modelの作成方法についてメモを残しておきます。

Railsにはscaffoldという機能があり、コレを使うと作成・更新・一覧表示などの機能をもったものを自動で作成してくれます。(詳細はググって下さい)
ただ、ここではこのscaffoldは使用しないものとします。




それでは。Userモデルを作成してみます

① モデル作成


# userモデルの作成
$ rails generate model user
      invoke  active_record
      create    db/migrate/20121204111949_create_users.rb
      create    app/models/user.rb
      invoke    test_unit
      create      test/unit/user_test.rb
      create      test/fixtures/users.yml

このコマンドにより。app/models/user.rb と、test配下のファイル、また、db/migrate/[timestamp]_create_users.rb が作成されます。



② db/migrate ファイルの編集


①で作成されたdb/migrate/[timestamp]_create_users.rb を開いて、以下のように編集

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :email, :null=>false

      t.timestamps
    end
  end
end

t.[データ型] :[カラム名],[オプション] の形式です。
ここで、Rails3系において使用出来るデータ型は、先程のURL先に書いてありますので、ご参照下さい。

ここで、t.timestamps を書いておけば、動的に created_at (作成日)updated_at (更新日) を追加してくれます。

ActiveRecord::Migration のメソッドに関しては、[コチラ] を参照。
あとは[ ココ(pentan.info) ]が非常にわかいやすくまとめて下さっています。



③ migrate処理を行う


# アプリケーションのルートディレクトリで以下を実行
rake db:migrate

これにより、先程編集した[timestamp]_create_users.rb の通りに、テーブルが作成されます。

マイグレーションに関するコマンドのリファレンスは [コチラ] を参照



④ modelに処理を書いてく

class User < ActiveRecord::Base
  def findall
    @users = User.all
  end
end

こんな感じで....
基本的に、Railsは「convention over configuration」(設定より規約) なので、データベース名やカラム名が規約と異ったりしない場合は何もかかなくてOKな様です。(つまり、migrateしてテーブルを作成した後は、modelにどんどんロジックを書いてくだけでOK)


とりあえず、今回はこんなとこです。


[...]

Categories: , , , , ,
Comments


基本的には以下の構成 (http://kinjo.github.com/ojag-rails/ を参考にしてます)

|-- app                                 # アプリのソースコード
|   |-- assets                          #
|   |   |-- images                      # 画像ファイル
|   |   |-- javascripts                 # javascript(CoffeeScript) ファイル
|   |   `-- stylesheets                 # stylesheet(SCSS) ファイル
|   |-- controllers                     # コントローラファイル
|   |-- helpers                         # ビューで使用するヘルパーファイル
|   |-- mailers                         #
|   |-- models                          # モデルをおきます
|   `-- views                           # ビューをおきます
|       `-- layouts                     # レイアウトに関するview
|-- config                              # アプリの設定ファイル
|   |-- application.rb                  # autoloadの設定などは
|   |-- boot.rb                         #
|   |-- database.yml                    # データベースの接続設定
|   |-- environment.rb                  #
|   |-- environments                    # 各実行モード (development, test, production) の設定
|   |   |-- development.rb              #
|   |   |-- production.rb               #
|   |   `-- test.rb                     #
|   |-- initializers                    # 使用する外部ライブラリやその設定等があれば initializers 配下に設定ファイルを作成します
|   |-- locales                         # 多言語化用の設定をおきます
|   |   `-- en.yml                      #
|   `-- routes.rb                       # URLとコントローラの対応付け(後述)を設定します。
|-- config.ru                           #
|-- db                                  #
|   `-- seeds.rb                        # 初期データの登録処理を書きます
|-- doc                                 #
|   `-- README_FOR_APP                  #
|-- lib                                 # 外部ライブラリやアプリ全体で使用するメソッドをおきます
|-- log                                 # アプリの実行時のログがあります
|   `-- development.log                 #
|-- public                              #
|-- script                              #
|-- test                                # テストプログラム
|-- tmp                                 #
`-- vendor                              # 外部ライブラリの内、プラグインと呼ばれるものは vendor 配下におかれます


  • htmlに関してはview, viewで使用するクラスなどはhelpersに
  • 基本的にモデルにロジックを書くこと
  • libディレクトリに、外部のディレクトリや独自モジュールなどを置く
  • アプリケーションと独立してるものはlibに置くけど、そうでなくアプリケーション独自のもの(アプリケーションに対して独立してないもの)は、正直appの外のlib内には置きたくない→app/配下に独自ディレクトリを作成し、autoloadする
  • autoloadに関しては、config, のapplication.rb で設定 (autoload対象のディレクトリを指定。その際に、app/配下の独自ディレクトリを指定すれば、それが使える)

こんな感じです。他のブログなどでは、lib に格納ってのがほとんどでしたが、アプリケーションとの結びつきが強いものをappディレクトリ外に置くのはなんか気持ち悪いので、とりあえずこの構成で開発することにします。
[...]

Categories: , ,
Comments
Comments

次に、Railsのプロジェクトを作成してみます。

RailsからMySQLを使用する場合、
http://www.oyabunn.com/wordpress/archives/60 こことか参考になるかも
# 使用するデータベースとしてmysqlを指定
$ rails new sample --database=mysql

ちなみに、データベースを指定しない場合はSQLiteになります。
プロジェクトが作成されたら、config/database.ymlを編集して(Host, User, Passwordを指定)、 実際に起動してみます

# サーバー起動
$ cd sample
$ rails server

するとこんなエラーが。。。。
/Users/yusuke/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/mysql2-0.3.11/lib/mysql2.rb:9:in `require': dlopen(/Users/yusuke/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundle, 9): Library not loaded: libmysqlclient.18.dylib (LoadError)
  Referenced from: /Users/yusuke/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundle
  Reason: image not found - /Users/yusuke/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundle
 from /Users/yusuke/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/mysql2-0.3.11/lib/mysql2.rb:9:in `'
 from /Users/yusuke/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/bundler-1.2.2/lib/bundler/runtime.rb:68:in `require'
 from /Users/yusuke/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/bundler-1.2.2/lib/bundler/runtime.rb:68:in `block (2 levels) in require'
 from /Users/yusuke/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/bundler-1.2.2/lib/bundler/runtime.rb:66:in `each'
 from /Users/yusuke/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/bundler-1.2.2/lib/bundler/runtime.rb:66:in `block in require'
 from /Users/yusuke/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/bundler-1.2.2/lib/bundler/runtime.rb:55:in `each'
 from /Users/yusuke/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/bundler-1.2.2/lib/bundler/runtime.rb:55:in `require'
 from /Users/yusuke/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/bundler-1.2.2/lib/bundler.rb:128:in `require'
 from /Users/yusuke/website/RAILS/sample/config/application.rb:7:in `'
 from /Users/yusuke/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/railties-3.2.9/lib/rails/commands.rb:53:in `require'
 from /Users/yusuke/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/railties-3.2.9/lib/rails/commands.rb:53:in `block in '
 from /Users/yusuke/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/railties-3.2.9/lib/rails/commands.rb:50:in `tap'
 from /Users/yusuke/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/railties-3.2.9/lib/rails/commands.rb:50:in `'
 from script/rails:6:in `require'
 from script/rails:6:in `
'

そこで、(http://stackoverflow.com/questions/4546698/library-not-loaded-libmysqlclient-16-dylib-error-when-trying-to-run-rails-servを参考に)以下のコマンドを実行

sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dy


もう一度サーバーを起動してみます。
(....と、その前に,DBのmigrateをしてみます詳しくは http://railsdoc.com/references/rake%20db:migrate )
rake db:migrate
これで、実際にDBにつながって、schema_migrations テーブルが作成されました!


# サーバー起動
$ rails server
=> Booting WEBrick
=> Rails 3.2.9 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2012-12-03 17:05:14] INFO  WEBrick 1.3.1
[2012-12-03 17:05:14] INFO  ruby 1.9.3 (2011-10-30) [x86_64-darwin11.4.2]
[2012-12-03 17:05:14] INFO  WEBrick::HTTPServer#start: pid=71027 port=3000

起動できました!! http://localhost:3000/ にアクセスしてみて下さい。

<備考...>
サブドメイン切ったりなどで、VirtualHost でrailsサーバーを複数たちあげたい場合は、その手前にApacheをはさめばいいのかな??
<VirtualHost *:80>
  ProxyPreserveHost On
  ServerName www.hogehoge.com
  ProxyPass / http://127.0.0.1:3000/
  ProxyPassReverse / http://127.0.0.1:3000/
</VirtualHost>
例えばこんな感じで。。。そこらへんまだ詳しくないです。
[...]

Categories: , , ,
Comments

Mac OS X (10.7 Lion) ローカルにRuby on Railsをインストールします。

まず、homebrew をインストールしてない場合は、インストールをしておいて下さい
(homebrewは便利なので、とりあえずインストールをおすすめします。)

① homebrew で rbenv, ruby-build のインストール
$ brew update
$ brew install rbenv
$ brew install ruby-build

② パスを通す
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ . ~/.bash_profile 

③ rbenv で ruby install
$ rbenv install 1.9.3-p0
$ rbenv global 1.9.3-p0 (macでこのrubyを使うように設定)

④ Ruby on Rails インストール
$ gem update
$ gem install rails
$ . ~/.bash_profile

バージョンを確認してみます
$ rails -v
Rails 3.2.9
[...]

Categories: , ,