Migrationの気付き
仕事ではMySQLしか使ってないので気づいてなかったけど、
Postgresqlではカラムを位置指定して追加することは出来ないようだ。。。
あと、調べてもあんまり出てこなかったので書いておくけど
Rails4.2時点ではオプションもちゃんと書いてやることでremove_columnもchange内に書ける
(いつから出来たのかは調べてない)
def change remove_column :users, :nickname, :string end
これでrollback時にはちゃんとadd_columnされる。
Rails4.2.0のadd_foreign_keyについて
Rails 4.2使い始めてschema.rbをgit管理している場合、
add_foreign_key
をadd_index
な感覚で使うと差分が発生してしまいそうなのでメモしておく。
add_index
add_index :suppliers, :name
としてやるとIndex名はデフォルトでindex_suppliers_on_name
となる。
それは
https://github.com/rails/rails/blob/4-2-stable/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb#L588
にある通り。
対象のカラムが特別多くなければ:name
オプションを使うこともないだろう。
add_foreign_key
add_foreign_key :articles, :authors
としてやると外部キー名は意外な事に
fk_rails_fa2b6bcbc5
(ランダム)となってしまう。
実装は
https://github.com/rails/rails/blob/4-2-stable/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb#L983
の通り。
というわけで、外部キーを作成するときは意識して:name
オプションを使っておかないと
毎回別名で作成されてschema.rbが犯されちゃうよー、というお話。
devise group
Railsでよく使う認証のgem。知らない人いないのでは。
今回ちょっと面倒な感じのログイン仕様でdeviseの中ずっと調べてたんだけど 3.3.0で追加されたらしい機能使ったのでメモ。
複数のモデル(Roleではなく)でログイン出来る作りのとき
[:user, :staff, :admin]
の3モデルあったとしたら
before_action :authenticate_user! before_action :authenticate_staff! before_action :authenticate_admin!
みたいな感じでそれぞれ書いてたと思うんだけど、それを
devise_group :blogger, contains: [:user, :staff, :admin] before_action :authenticate_blogger!
って書けちゃう。楽ちん。
ログインしてるデータを取得するときも、いつものdeviseの感じで
current_blogger
ってやれば取得出来る。
こんな仕様にならない様に作ったほうが良いと思うんだけどねぇ…
GithubからOdooをUbuntu14.04に導入してみる
Odoo(旧称OpenERP)はベルギーのOpenERP S.A.社により開発とりまとめが行われている、世界で大人気のオープンソースの業務アプリケーションスイートです。
Open Source ERP and CRM | Odoo
何か知らんがプロジェクト管理が急にやって来たので、前から使ってみようと思ってたコレを導入してみる。
環境はUbuntu Server 14.04LTSでOdooはGithubから
Ubuntuを最新の状態に
sudo apt-get update sudo apt-get upgrade -y
PostgreSQLのインストール
sudo apt-get install postgresql -y sudo su - postgres -c "createuser -s odoo" 2> /dev/null || true
必要なパッケージのインストール
# tool packages sudo apt-get install wget subversion git bzr bzrtools python-pip -y # python packages sudo apt-get install python-dateutil python-feedparser python-ldap python-libxslt1 python-lxml python-mako python-openid python-psycopg2 python-pybabel python-pychart python-pydot python-pyparsing python-reportlab python-simplejson python-tz python-vatnumber python-vobject python-webdav python-werkzeug python-xlwt python-yaml python-zsi python-docutils python-psutil python-mock python-unittest2 python-jinja2 python-pypdf python-decorator python-requests python-passlib python-pil -y # python libraries sudo pip install gdata
odooユーザーの作成とログフォルダの作成
sudo adduser --system --quiet --shell=/bin/bash --home=/var/odoo --group odoo sudo mkdir /var/log/odoo sudo chown odoo:odoo /var/log/odoo
Odooのインストール
sudo git clone --branch 8.0 https://www.github.com/odoo/odoo /var/odoo/odoo-server/ # make custom module directory sudo su odoo -c "mkdir -p /var/odoo/custom/addons" # setting permissions sudo chown -R odoo:odoo /var/odoo/* # create config file sudo cp /var/odoo/odoo-server/debian/openerp-server.conf /etc/odoo-server.conf sudo chown odoo:odoo /etc/odoo-server.conf sudo chmod 640 /etc/odoo-server.conf # edit config file sudo sed -i s/"db_user = .*"/"db_user = odoo"/g /etc/odoo-server.conf sudo sed -i s/"; admin_passwd.*"/"admin_passwd = xxxxxxxxxxxxxxx"/g /etc/odoo-server.conf sudo sed -i "s|addons_path = .*|addons_path = /var/odoo/odoo-server/addons,/var/odoo/custom/addons|g" /etc/odoo-server.conf sudo su root -c "echo 'logfile = /var/log/odoo/odoo-server.log' >> /etc/odoo-server.conf" # create startup file sudo vim /var/odoo/odoo-server/start.sh #!/bin/sh sudo -u odoo /var/odoo/odoo-server/openerp-server --config=/etc/odoo-server.conf sudo chmod 755 /var/odoo/odoo-server/start.sh
起動スクリプト作成
sudo wget https://gist.githubusercontent.com/NaturalHokke/1575bb515c6583b39e3f/raw/c2d28feec5906176fb7e52070e640523cb3199de/odoo-server -O /etc/init.d/odoo-server sudo chmod 755 /etc/init.d/odoo-server sudo chown root: /etc/init.d/odoo-server
スクリプトでの起動確認
sudo /etc/init.d/odoo-server start
sudo tail -f /var/log/odoo/odoo-server.log
でPort: 8069で起動している事を確認。
ブラウザでアクセスしてちゃんと画面出ればOK
sudo /etc/init.d/odoo-server stop
自動起動設定
sudo update-rc.d odoo-server defaults
ここまででOdooの設定は完了したので、あとはPort80で使えるようにNginx入れて終了です。
Nginxインストール
sudo add-apt-repository ppa:nginx/stable sudo apt-get update sudo apt-get upgrade sudo apt-get install nginx sudo /etc/init.d/nginx start
これでPort: 80でアクセスしてNginxのGreetingsページが出ればOK。
Nginx設定
upstream odoo { server 127.0.0.1:8069; } server { listen 80 default_server; listen [::]:80 default_server; server_name odoo.dev.green-bell.jp; access_log /var/log/nginx/odoo.access.log; error_log /var/log/nginx/odoo.error.log; proxy_buffers 16 64k; proxy_buffer_size 128k; keepalive_timeout 60; location / { proxy_pass http://odoo; proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
リンクしてreloadしてOK(疲れた
Rails事始め
新しくプロジェクト作る時に毎回見直しをする。
前提
- 開発環境はMac
- Rubyのインストールにはrbenvを使用する
- gemは全てプロジェクト以下に入れたい(システムgemには入れたくない)
- DBはMySQLを使う
- Turbolinksは使わない
- テストはRspec
- 環境依存な値は環境変数を使っていく(direnv使用)
- その時その時で有用なgemを使いたいので、Templateは使用しない
プロジェクト作成
$ mkdir project_name $ cd project_name $ rbenv local 2.2.0 # rails 4.2のインストール準備 $ bundle init $ sed -i '' -e '1d' -e 's/# //g' Gemfile $ bundle install --path vendor/bundle --without staging production --jobs 4 # -T = test-unit skip # -B = bundle install skip # -f = force overwrite files $ bundle exec rails new . -TBf -d mysql --skip-turbolinks $ bundle install $ curl -o .gitignore https://raw.githubusercontent.com/github/gitignore/master/Rails.gitignore $ git init $ git remote add origin your:repository $ git add -A $ git commit -m 'rails setup'
ここまでで一旦Commitしておく。Railsの(ほぼ)デフォルトの状態。
初期設定
Gemfile設定
source 'https://rubygems.org' # rubyのバージョン指定とrailsだけ最初に指定 # 他のgemはASCII順に並べておく ruby '2.2.0' gem 'rails', '4.2.0' gem 'airbrake' # HerokuにErrbit立ててるので入れる gem 'bootstrap-sass' # 大体Bootstrapで作る gem 'bootstrap-sass-extras' gem 'coffee-rails', '~> 4.1.0' gem 'jbuilder', '~> 2.0' gem 'jquery-rails' gem 'kaminari' # ページ送りは大体入れる gem 'mysql2' gem 'newrelic_rpm' # 便利 gem 'sass-rails', '~> 5.0' gem 'slim-rails' # テンプレートエンジンはSlimがお好き gem 'uglifier', '>= 1.3.0' group :development, :test do gem 'pry-byebug' gem 'pry-rails' gem 'pry-rescue' gem 'rspec-rails' gem 'spring' gem 'web-console', '~> 2.0' end group :test do gem 'database_rewinder' gem 'faker' gem 'factory_girl_rails' end
$ bundle
spring(環境変数)設定
$ bundle exec spring binstub --all $ echo 'export PATH=$PWD/bin:$PATH' > .envrc $ echo 'export DATABASE_PASSWORD=xxxxx' >> .envrc $ direnv allow
database.yml設定
default: &default adapter: mysql2 encoding: utf8 pool: 5 username: root password: <%= ENV['DATABASE_PASSWORD'] %> socket: /tmp/mysql.sock development: <<: *default database: project_name_development test: <<: *default database: project_name_test production: url: <%= ENV['DATABASE_URL'] %>
application.rb設定
require File.expand_path('../boot', __FILE__) require "active_model/railtie" require "active_job/railtie" require "active_record/railtie" require "action_controller/railtie" require "action_mailer/railtie" require "action_view/railtie" require "sprockets/railtie" Bundler.require(*Rails.groups) module ProjectName class Application < Rails::Application config.time_zone = 'Tokyo' config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s] config.i18n.default_locale = :ja config.generators do |g| g.assets false g.helper false g.template_engine :slim g.fixture_replacement: :factory_girl, dir: 'spec/factories' g.test_framework :rspec, view_specs: false, routing_specs: false, helper_specs: false, integration_tool: false end config.active_record.raise_in_transactional_callbacks = true end end
Airbrake(Errbit)設定
$ touch config/initializers/airbrake.rb
Airbrake.configure do |config| config.api_key = "#{ENV["ERRBIT_API_KEY"]}" config.host = 'hostname' config.port = 80 config.secure = config.port == 443 end
rspec設定
$ rails generate rspec:install $ bundle binstubs rspec-core $ cat spec/rails_helper.rb
ENV["RAILS_ENV"] ||= 'test' require 'spec_helper' require File.expand_path("../../config/environment", __FILE__) require 'rspec/rails' ActiveRecord::Migration.maintain_test_schema! RSpec.configure do |config| config.use_transactional_fixtures = true config.infer_spec_type_from_file_location! config.include FactoryGirl::Syntax::Methods config.before :all do FactoryGirl.reload end config.before :suite do DatabaseRewinder.clean_all end config.after :each do DatabaseRewinder.clean end end
大体こんな感じだろうか