都道府県コードや市区町村コードをDBにマスタデータとして作成
全国版のポータルサイトなどを作成する際に、会社情報などを登録するフォームを作成すると思いますが、住所の登録などをどのように構築するかいつも悩んでしまいます。
登録だけでなく検索でも都道府県などの住所を流用した検索画面にしたい場合は、おそらくですが都道府県と市区町村をDBに保持し、コードなどで検索をすると思います。
今回はその都道府県コードや市区町村コードを利用し、railsへの組み込み方法を考えていきます。
railsのseedを使用するので、都道府県と市区町村のCSVファイルを2個準備します。
まずデータをDL
兎にも角にもデータが無いと、どうしようもないのでgoogle先生に訪ねてみました。
「先生!市区町村コードをDL出来る優良サイトは無いっすか?」
はい、有りました。
http://www.dictator.co.jp/i/i_jis/i_jis_00_handle.html
武蔵野ウイング有限会社様が無料で提供していました。
本当に感謝です。
早速CSVをDLしてきます。
CSVをそのまま使用してもいいのですが、ちょっとだけ加工します。
コード,CD付き,市区町村名,よみがな,市外局番,主要郵便番号上5桁 01100,011002,札幌市,さっぽろし,, 01101,011011,札幌市中央区,さっぽろしちゅうおうく,011,060-00 064-08 064-09 これを・・・ 1,札幌市,さっぽろし 1,札幌市中央区,さっぽろしちゅうおうく このように変更します。 rubyでスクリプト組んでもいいですが、あまり修正を入れない情報なので、サクラエディタなどを活用しデータを加工しました。 短径選択するだけです。1分で終わります。(プログラム組むより早いですね)
都道府県コードに関しては、47都道府県しか無いので自作します。
(探せばあると思いますが、面倒くさいので作ったほうが早いです。)
北海道 青森県 岩手県 宮城県 秋田県 山形県 福島県 茨城県 栃木県 群馬県 埼玉県 千葉県 東京都 神奈川県 新潟県 富山県 石川県 福井県 山梨県 長野県 岐阜県 静岡県 愛知県 三重県 滋賀県 京都府 大阪府 兵庫県 奈良県 和歌山県 鳥取県 島根県 岡山県 広島県 山口県 徳島県 香川県 愛媛県 高知県 福岡県 佐賀県 長崎県 熊本県 大分県 宮崎県 鹿児島県 沖縄県
これで2個のCSVができたと思います。
とりあえず都道府県のCSVをmst_japans.csv、市区町村のCSVをmst_cities.csvと名称を付けます。
(文字コードはUTF-8に)
そしてファイルを「db」の直下に配置します。
DBの構成
リレーションさせますので、簡単なDB構成をメモ
# 都道府県テーブル rails g model mst_japan id:integer name:string # 市区町村テーブル rails g model mst_city id:integer japan_id:integer name:string kana:string
seed.rbに追記
seed.rbにプログラムを追加します。
require "csv" # mst_japans CSV.foreach('db/mst_japans.csv') do |row| MstJapan.create(:id => row[0], :name => row[1]) end # mst_cityes CSV.foreach('db/mst_cities.csv') do |row| MstCity.create(:id => row[0], :japan_id => row[1], :name => row[2], :kana => row[3]) end
コマンド
rake db:seed
これでデータが入ると思います。
railsにtwitter bootstrapを導入する。
デザインセンスがないので、「twitter bootstrap」を導入してみます。
んで、githubで色々と探していたら、結構出てきました。
その中で今回は「twitter-bootstrap-rails」を使用したいと思います。
まずGemfileの修正
gem "twitter-bootstrap-rails"
んで「bundle install」を行います。
bundle install
bootstrapを組み込む
railsでtwitter bootstrapが使用出来るようにします。
rails g bootstrap:install
layoutにtwitter bootstrapを適用させたい場合は
rails g bootstrap:layout [LAYOUT_NAME] [*fixed or fluid] #以下サンプル rails g bootstrap:layout application fixed #よくわからないのですがfixedを指定してもfluidを指定してもレイアウトに変化が見られませんでした・・・
上記だけで、テンプレートが使用できます。
ちなみにCSSテンプレートは「sass」ではなく「less」みたいです。
「less」は後発らしく、CSSへの変換はJavascriptで出来きます。
うむぅ面白い・・・
erbをhamlに変換する。
詳細はここから確認してください。
gemファイルに追加
group :development do gem 'erb2haml' end
実行
$ bundle install
んで変換
rake haml:convert_erbs
元ファイルは残るみたいですね。
必要に応じて削除しましょう。
メモ:プロジェクト内の「.erb」を全て削除する。
find ./ -name *.erb -exec rm {} \;
bundler入門
今まで何気にbundlerを使っていたが、あまり詳しく知らなかったので、勉強+ブログ更新がてら再度勉強することにしました。
といっても本サイトをコピペするだけですけど。。。
まずはじめに
bundlerをインストールします
gem install bundler
プロジェクトルートに「Gemfile」を作成して設置します。
Gemfileの編集
作成した「Gemfile」にURLを指定します
以下の3つのどれでもいいみたいです。gemのDL先の指定ですね。
source "http://rubygems.org" source "http://gems.rubyforge.org" source "http://gemcutter.org"
インストールしたいパッケージを追加する
とりあえず「rails」を入れときます
gem "rails", "3.2.1"
編集完了したらインストールする
$ bundle install
その他の設定
バージョン番号など、必要なgemsを宣言します。構文を使い使用するバージョンを指定する
ちょっと「~」(チルダ)の使い方が特殊なぐらいで、簡単に指定できます。
#何も指定なしだったら、最新をインストール gem "nokogiri" # 指定したバージョンがインストールされる gem "rails", "3.0.0.beta3" # バージョン1.0以上をインストール gem "rack", ">=1.0" # 例を一応出します。 # "~>2.0.3"は">=2.0.3" と "<2.1" の間にマッチする。 # "~>2.1"は">=2.1" と "<3.0" の間にマッチする。 # "~>2.2.beta" は "2.2.beta.12" のようにマッチする。 gem "thin", "~>1.1"
gemのメインファイルが、gem名と異なる場合は、それを要求する方法を指定する
gem "rspec", :require => "spec" gem "sqlite3-ruby", "1.2.5", :require => "sqlite3"
Gitを指定することも可能
gem "nokogiri", :git => "git://github.com/tenderlove/nokogiri.git", :branch => "1.4"
group化する
gemをグループ分けし環境でgemの使い分けができます。
gem "wirble", :group => :development group :test do gem "rspec" gem "faker" end
グループを除外してインストールすることができます。
これによって、本稼働時のインストールとテスト時のインストールを使い分けることができます。
$ bundle install --without test development
ちなみにGemfileはデフォルトで「group: assets」となっている。(rails3.2)
最初勘違いしたのだが「assets」は本番環境で読み込むんだったら、「production」じゃないか?と思ったら
じつは「application.rb」で
Bundler.require(*Rails.groups(:assets => %w(development test)))
ってなっていました、これで「development test」では「assets」は読み込まないってなってたんですね・・・
しらなかったorz
まとめ
まだ理解していないところが多いですが、今回はここまで!
時間があるときに、また追記します。
「rails generate devise:install」をした際に初期設定を言われたのでメモっとく
本当にメモです。
以下、和訳
Some setup you must do manually if you haven't yet:
※いくつかのセットアップを手動で行う必要があります。
1. Ensure you have defined default url options in your environments files. Here
is an example of default_url_options appropriate for a development environment
※あなたの環境ファイルにデフォルトのurlオプションが定義されていることを確認してください。
※以下のdefault_url_optionsの設定例はdevelopmentで適しています。
in config/environments/development.rb:
config.action_mailer.default_url_options = { :host => 'localhost:3000' }
In production, :host should be set to the actual host of your application.
※製品環境では「:host」を実際のホストに設定する必要があります。
2. Ensure you have defined root_url to *something* in your config/routes.rb.
※config/routes.rb内で*something*にroot_url定義されていることを確認します。
For example:
root :to => "home#index"
3. Ensure you have flash messages in app/views/layouts/application.html.erb.
※app/views/layouts/application.html.erbにflashメッセージを持っていることを確認してください。
For example:
<p class="notice"><%= notice %></p> <p class="alert"><%= alert %></p>
4. If you are deploying Rails 3.1 on Heroku, you may want to set:
※Heroku上にRails 3.1を公開している場合は、設定した方がいいですよ。
config.assets.initialize_on_precompile = false
和訳間違ってたらご指摘ください。(ホントgoogle翻訳さまさまやで)
ruby on railsをubuntu11.10にインストール
今回はフルスタックのフレームワークで有名な「ruby on rails」をubuntuにインストールします。
フレームワークは学習コストが高いですが、それに対する見返りのほうが大きいので是非勉強することをお勧めします。
フレームワーク導入の利点!
- 開発生産性の向上
- 設計方針や基盤部分のコードをフレームワークに委ねますので、考える必要がなくなります。
- メンテナンス性に優れる
- コードに一貫性が出るので可読性があがります。
- 品質が担保できる
- 練られたフレームワークは「信頼性が高い」です。
railsの記事を読むと必ず出てくる決まり文句?があります。
DRY(Don't Repeat Yourself) = 同じ記述を繰り返さない
CoC(Convention over Configuration) = 設定よりも規約
上記の設計哲学を引き継いで開発されたフレームワークは「cakephp」などが存在します。
railsはrubyだけではなく他言語まで影響を与えるフレームワークと言えます。
まぁrailsの説明はここまでにして、早速インストール手順から入ります。
前回のruby導入からの続きです。
Bundlerのインストール
bundlerとは外部のGemを管理するためのツールでGemfile上で記述されているgemの依存関係を解決し、その上で必要なパッケージをインストールしてくれます。
ですので、パッケージをインストールする際は「Gemfile」の修正のあと「bundle install」を行うようにします。
$ gem install bundler
ディレクトリの作成
Railsをインストールするディレクトリを作成します。
$ mkdir -p ~/sample $ cd ~/sample/
railsのインストール
$ rails new
Gemfileの編集
おそらくデフォルトのGemfileが作成されるので、編集を行います。
※自分はmysqlを使いたいので以下の内容に変更
gem 'sqlite3' ↓ gem 'mysql2'
パッケージのインストール
$ bundle install
ruby on rails3 + paperclip + amazon S3 に画像をアップしてみる
はい、rails初心者です。
初回はrailsからAWSのS3に画像をアップしてみます。
ほとんどrails触ったことないんで、実際に完成できるか心配ですが頑張ってみます。
(環境に関しては次回まとめます。ちなみに nginx + passenger + mysqlです。)
railsのインストールなどは行なっている前提で書きます。
まず画像アップ用のプラグインは「paperclip」を利用します。
他にもDragonflyなどもあるらしいですが、情報が少なかったので今回は「paperclip」で!
Gemfileを修正
まず「paperclip」は必要だが、他にも「aws-sdk」が必要なのでGemfileに書き込む。
gem 'paperclip' gem 'aws-sdk', '~> 1.3.4'
書き込みが完了したら、「bundle install」を行う。
$ bundle install
modelの準備
今回は新たにmodelを作成する。
rails g scaffold item name:string
テーブル準備
rake db:migrate
Modelの修正を行う。
class Item < ActiveRecord::Base has_attached_file :photo, :styles => { :thumb => "100x100", :medium => "200x200", :large => "600x400" }, :storage => :s3, :s3_credentials => "#{Rails.root}/config/s3.yml", :url => "AWS_URL", :s3_host_name => "AWS_URL", :path => ":attachment/:id/:style.:extension" end
s3_credentialsで呼び出しているs3.ymlファイルを新規で作成。
※設定はAWSから取得する。
development: bucket: myappdevelopment access_key_id: your key secret_access_key: your key test: bucket: myapptest access_key_id: your key secret_access_key: your key production: bucket: myapp access_key_id: your key secret_access_key: your key
画像の情報を保存するためにitemsテーブルを変更するので
マイグレーション用のスクリプトを作成する。
※各カラムのphoto_○○は、has_attached_fileの引数で指定した名称になる。
$ rails g migration add_photo_columns_to_item
class AddPhotoColumnsToItem < ActiveRecord::Migration def self.up add_column :items, :photo_file_name, :string add_column :items, :photo_content_type, :string add_column :items, :photo_file_size, :integer add_column :items, :photo_updated_at, :datetime end def self.down remove_column :items, :photo_file_name remove_column :items, :photo_content_type remove_column :items, :photo_file_size remove_column :items, :photo_updated_at end end
マイグレーションする。
rake db:migrate
viewの修正
_form.html.erbを編集
#一行目編集 <%= form_for @item , :html => { :multipart => true } do |f| %> #formタグの中に追加 <%= f.file_field :photo %>
show.html.erbを編集
<%= image_tag @product.photo.url %> <%= image_tag @product.photo.url(:medium) %> <%= image_tag @product.photo(:thumb) %> <%= image_tag @product.photo(:large) %>
とりあえずS3にはアップできたが、表示側が見れないorz
多分modelの設定だと思うが。。。とりあえずDocumentを読んでみる。
※「s3_host_name => "AWS_URL"」を追加すると正常に見れます。
よくわからないですが、勝手に違うリージョンに行ってたみたいです・・・なんでですかね?
https://github.com/thoughtbot/paperclip
http://rubydoc.info/gems/paperclip/Paperclip/Storage/S3