ラベル rails の投稿を表示しています。 すべての投稿を表示
ラベル rails の投稿を表示しています。 すべての投稿を表示

2015年12月23日水曜日

Capistranoの実行環境を作成する3

Front1 serverでの作業
SSLのkeyを作成
sudo openssl req -new -days 365 -x509 -nodes -keyout cert.key -out cert.crt
mv cert.key /etc/nginx
mv cert.crt /etc/nginx
udo vi /etc/nginx/conf.d/target.conf
try_filesの設定が重要になります。
1、$uri
2、$uri.html
3、$uri/index.html
とアクセスして、最後に@appにアクセスします。
4、location @appに遷移
5、proxy_passでupstream backend-unicornに遷移。
6、Rails側でも設定したunicorn.sockにアクセスがいきます。
upstream backend-unicorn {
    server unix:/srv/www/target/shared/tmp/sockets/unicorn.sock;
}
 
server {
    allow all;
    listen 80;
    listen 443 ssl;
    ssl_certificate      /etc/nginx/cert.crt;
    ssl_certificate_key  /etc/nginx/cert.key;
    server_name target.com;
    root /srv/www/target/current/public;
    try_files $uri $uri.html $uri/index.html @app;
    access_log /var/log/nginx/target_access.log;
    error_log /var/log/nginx/target_error.log;

    location @app {
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X_FORWARDED_PROTO $scheme;
        proxy_set_header Host $http_host;
        proxy_pass http://backend-unicorn;
        proxy_redirect off;
    }
    if (-f /srv/www/target/shared/public/system/maintenance.html) {
        return 503;
    }
    error_page 503 @503;
    location @503 {
        if (-f $request_filename) {
            break;
        }
        rewrite ^(.*)$ /system/maintenance.html break;
    }
    gzip_vary on;
    gzip_static on;
}
SELinuxをoff
setenforce 0
Unicornに問い合わせがいかないように設定
config/environmebts/production.rb
config.serve_static_assets = false
js, cssの動的なcompileをしないように設定。 逆に言えば、js,cssが正しく設定されていないと、ファイルが見つからないのでエラーが出ます。
config.assets.compile = false
localのMacサーバーでhostsを設定します。
sudo vi /etc/hosts
192.168.43.62 target.com
このURLからアクセスできます。
https://target.com/

Capistranoの実行環境を作成する2

japan user in Host
ssh-keygen -t rsa
パスワードはpassword
su - japan
git cloneで対象をダウンロード
git clone git@github.com
cd your dir
bundle install --path vendor/bundle
確認
bundle exec cap -T
eval `ssh-agent -s`
ssh-add ~/.ssh/id_rsa
ここにはdevelopment, staging, productionに共通の設定を記述
vi config/deploy.rb
lock '3.2.1'
set :user, 'japan'
set :application, 'target'
set :repo_url, 'git@github.com:target.git'
set :scm, :git
set :deploy_via, :remote_cache
set :keep_releases, 5
set :deploy_to, "/srv/www/#{fetch(:application)}"
shared_path = "#{fetch(:deploy_to)}/shared"
release_path = "#{fetch(:deploy_to)}/current"
set :linked_files, %w{config/database.yml config/application.yml}
set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets bundle}
set :unicorn_pid, "#{shared_path}/tmp/pids/unicorn.pid"
set :unicorn_config_path, "#{release_path}/config/unicorn.rb"
after 'deploy:publishing', 'deploy:restart'
namespace :deploy do
  task :restart do
    invoke 'unicorn:restart'
  end
end
ここにはproduction用の設定を記述 
vi config/deploy/production.rb
set :rails_env, 'production'
set :branch, 'master'
server '192.168.43.62', user: 'japan', roles: %w{web app db}, :primary => true
set :ssh_options, keys: %w(/home/japan/.ssh/id_rsa), forward_agent: true, auth_methods: %w(publickey)
set :unicorn_rack_env, 'production'
vi config/unicorn.rb
app_path = "/srv/www/target"
 
# Set unicorn options
worker_processes 4
preload_app true
#integration server is slow
timeout = 30
listen "#{app_path}/shared/tmp/sockets/unicorn.sock"
working_directory = "#{app_path}/current"
# Spawn unicorn master worker for user apps (group: apps)
# Should be 'production' by default, otherwise use other env
rails_env = ENV['RACK_ENV'] || ENV['RAILS_ENV'] || 'production'
# Log everything to one file
stderr_path "log/unicorn.log"
stdout_path "log/unicorn.log"
# Set master PID location
pid "#{app_path}/shared/tmp/pids/unicorn.pid"
preload_app true
before_fork do |server, worker|
  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.connection.disconnect!
  old_pid = "#{server.config[:pid]}.oldbin"
  puts "old_pid=#{old_pid}"
  if File.exists?(old_pid) && server.pid != old_pid
    begin
      Process.kill("QUIT", File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH
    end
  end
end
after_fork do |server, worker|
  if defined?(ActiveRecord::Base)
    config = Rails.application.config.database_configuration[Rails.env]
    config['reaping_frequency'] = ENV['DB_REAP_FREQ'] || 10 # seconds
    config['pool']              = ENV['DB_POOL'] || 5
    ActiveRecord::Base.establish_connection(config)
  end
end
before_exec do |server|
  ENV["BUNDLE_GEMFILE"] = "/srv/www/target/current/Gemfile"
end
bundle exec cap production deploy
nokogiriでエラーが出る時は、これを忘れずに。
bundle config build.nokogiri --use-system-libraries

2015年12月22日火曜日

Capistranoの実行環境を作成する1

前提

  • Mac環境
  • VirtualBoxはinstall済み
  • Vagrantはinstall済み

mkdir cap_test
cd cap_test
vagrant box add "centos_6.6" https://github.com/tommy-muehle/puppet-vagrant-boxes/releases/download/1.0.0/centos-6.6-x86_64.box
vagrant init
vi Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.define "host" do |node|
    node.vm.box = "centos_6.6"
    node.vm.hostname = "host"
    node.vm.network :private_network, ip: "192.168.43.61"
  end
  config.vm.define "front1" do |node|
    node.vm.box = "centos_6.6"
    node.vm.hostname = "front1"
    node.vm.network :private_network, ip: "192.168.43.62"
  end
end
vagrant up
vagrant status

Set UP Ansible in Host

vagrant ssh host
#password is vagrant
su -
wget https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -Uvh epel-release-6-8.noarch.rpm
yum install -y ansible

Setup ssh

ssh-keygen -t rsa
vi ~/.ssh/config
Host front1
  HostName 192.168.43.62
chmod 600 ~/.ssh/config
ssh-copy-id front1
これはHostとFrontの両方
sudo yum -y update

Anslbleを使用

Host
vi hosts
[host]
192.168.43.61
[front1]
192.168.43.62
ansibleの確認
ansible all -i hosts -m ping
machineのスペックの確認
ansible all -i hosts -m setup
パスワード作成: passwordという文字列を暗号化
sa3tHJ3/KuYvI
python -c 'import crypt; print crypt.crypt("password", "salt")'   
create japan group and japan user
---
- hosts: all
  sudo: yes
  tasks:
    - name: create japan group
      group: name=japan state=present
    - name: add a japan user
      user: name=japan append=yes group=japan groups=japan,wheel password=sa0l6dugPm7w2
    - name: create directory
      file: path=/srv/www state=directory owner=japan group=japan mode=0755
    - name: install libselinux-python
      yum: name=libselinux-python state=latest
    - name: install git
      yum: name=git state=latest
    - name: remove ruby packages
      yum: name={{item}} state=absent
      with_items:
       - ruby
       - ruby-augeas
       - ruby-libs
       - libselinux-ruby
    - name: download ruby
      get_url: url="ftp://ftp.ruby-lang.org/pub/ruby/ruby-2.1.0.tar.gz" dest=/usr/local/src
    - name: tar
      unarchive: src=/usr/local/src/ruby-2.1.0.tar.gz dest=/usr/local/src
    - name: configure
      command: ./configure --prefix=/usr/local/ruby-2.1.0 --disable-install-rdoc --disable-install-capi chdir=/usr/local/src/ruby-2.1.0
    - name: make
      command: make chdir=/usr/local/src/ruby-2.1.0
    - name: make install
      command: make install chdir=/usr/local/src/ruby-2.1.0
    - name: change .bashrc for root
      lineinfile: dest=/root/.bashrc
                  line='PATH=$PATH:$HOME/bin:/usr/local/ruby-2.1.0/bin'
                  backup=yes
                  state=present
    - name: export .bashrc
      lineinfile: dest=/root/.bashrc
                  line='export PATH'
                  state=present
    - name: source .bashrc for root
      shell: source /root/.bashrc
    - name: change .bashrc for japan
      lineinfile: dest=/home/japan/.bashrc
                  line='PATH=$PATH:$HOME/bin:/usr/local/ruby-2.1.0/bin'
                  backup=yes
                  state=present
    - name: export .bashrc
      lineinfile: dest=/home/japan/.bashrc
                  line='export PATH'
                  state=present
    - name: source .bashrc for japan
      shell: source /home/japan/.bashrc
    - name: gem update
      shell: /usr/local/ruby-2.1.0/bin/gem update --system
    - name: gem install bundle
      shell: /usr/local/ruby-2.1.0/bin/gem install bundle
ansible-playbook -v -i hosts playbook_all.yml
vi playbook_host.yml
---
- hosts: front1
  sudo: yes
  tasks:
    - name: install memcached
      yum: name=memcached state=present
    - name: install ImageMagick packages
      yum: name={{item}} state=present
      with_items:
       - ImageMagick
       - ImageMagick-perl
    - name: update mysql rpm
      yum: name="http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm" state=present
    - name: install mysql packages
      yum: name={{item}} state=present
      with_items:
       - mysql
       - mysql-server
       - mysql-devel
    - name: update nginx rpm
      yum: name="http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm" state=present
    - name: install nginx
      yum: name=nginx
    - name: install libxml2 packages
      yum: name={{item}} state=present
      with_items:
       - libxml2
       - libxml2-devel
    - name: install libxslt packages
      yum: name={{item}} state=present
      with_items:
       - libxslt
       - libxslt-devel
    - name: service mysql nginx memcached
      service: name={{item}} state=started enabled=yes
      with_items:
       - mysqld
       - nginx
       - memcached
ansible-playbook -v -i hosts playbook_host.yml

Set UP ssh

vagrant ssh host 
#password is vagrant
su -
visudo
変更
#%wheel  ALL=(ALL)
%wheel  ALL=(ALL)       ALL
su - japan
set id_rsa.pub
vi ~/.ssh/config
Host front1
  HostName 192.168.43.62
chmod 600 ~/.ssh/config
user is japan
ssh-copy-id front1
ログインを確認
ssh front1

2014年5月9日金曜日

Capybaraで謎のエラーが発生

こんな感じのエラーが発生
  NameError: uninitialized constant Zip::File
どうも、これが悪さをしているらしいので、このgemを削除
gem 'zip'
代わりにこれをインストール
gem 'zip-zip'

2013年11月27日水曜日

RailsでModelの翻訳メソッド

User.model_name.human #=> "User"

I18n.locale = :ja
User.model_name.human #=> "ユーザー"

# 属性名
I18n.locale = :en
User.human_attribute_name("name") #=> "name"

I18n.locale = :ja
User.human_attribute_name("name") #=> "名前"
設定ファイル config/locales/models/user/ja.yml
ja:
  activerecord:
    models:
      user: ユーザー
    attributes:
      user:
        name: 名前

Railsで全Model名を取得する

Railsで動いている全モデル名を取得
  Module.constants.select do |constant_name|
   constant = eval constant_name.to_s
     if not constant.nil? and constant.is_a? Class and constant.superclass == ActiveRecord::Base
       puts constant
     end
  end

2013年11月26日火曜日

Railsでcapistranoを設定する。

前提
  1. sshでサーバーにログイン可能にしておく。公開鍵認証。
  2. 同様の鍵で、サーバーでgit cloneできるようにもしておく。
Capistaranoの設定
config/deploy.rb
set :application, 'portal'
set :scm, :git #gitを使用
#set :repository, '/Users/test/Documents/workspace/portal' #ローカルのソースを使う時はこちら
set :repo_url, 'git@git.gree-dev.net:test/portal.git' #レポジトリのソースを使う時はこちら
set :deploy_to, '/srv/www/portal' #デプロイ先
set :log_level, :debug #デバッグモード

set :git_shallow_clone, 1 #最新版のみを使う?
set :keep_releases, 10 #リリース先のディレクトリを常に10個に保つ
set :branch, "production" "使用するブランチ名
set :deploy_via, :remote_cache #効率的らしい?

namespace :deploy do
  desc 'Restart application'
  task :restart do
    on roles(:app), in: :sequence, wait: 5 do
      execute :touch, current_path.join('tmp/restart.txt')
    end
  end

  after :restart, :clear_cache do
    on roles(:web), in: :groups, limit: 3, wait: 10 do
    end
  end

  after :finishing, 'deploy:cleanup'

end
config/deploy/production.rb
set :stage, :production 
set :default_stage, :production

role :app, %w{10.32.4.3}
role :web, %w{10.32.4.3}
role :db,  %w{10.32.4.3}

  server '10.32.4.3',#サーバーIP
    user: 'test'
    set :ssh_options, {
      keys: %w(/Users/test/.ssh/id_rsa), #鍵の場所
      forward_agent: :true, 
      auth_methods: %w(publickey), #公開鍵認証
#      verbose: :debug #sshのデバッグモード
    }

2013年11月25日月曜日

Railsでcapybaraとrspecを使ってExcelに出力する

Gemfileの設定
group :development do
  gem "rspec"
  gem "rspec-rails"
  gem "mocha"
  gem "axlsx"
  gem 'capybara'
  gem 'capybara-webkit'
  gem 'turnip'
  gem 'selenium-webdriver'
end
bundle install
spec/spec_helperの設定
  
  def excel
    @@excel ||= Axlsx::Package.new
  end
  def font1(v=nil)
    if v
      f = Struct.new(:value)
      @@font1 = f.new(v)
    else
      @@font1
    end
  end

  def font2(v=nil)
    if v
      f = Struct.new(:value)
      @@font2 = f.new(v)
    else
      @@font2
    end
  end

  def wb
    @@wb = excel.workbook
    font1(@@wb.styles.add_style :sz => 15, :name => "MS Pゴシック")
    font2(@@wb.styles.add_style :sz => 15, :name => "MS Pゴシック", :bg_color => "FFFF0000")
    @@wb
  end

  def worksheet
    @@worksheet ||= wb.add_worksheet(name: 'test')
  end

  config.before(:suite) do
    worksheet.add_row(['検証項目', '○/×'], :style => font1.value)
  end

  # テスト実行後に成否を取得してレポートに記入する
  config.after(:each) do
    # テストの検証項目名を取得する
    description = self.example.full_description
    if self.example.metadata[:description].empty?
      description += RSpec::Matchers.generated_description
    end

    #Modelの英語表記を日本語に返還
    Module.constants.select do |constant_name|
      constant = eval constant_name.to_s
      if not constant.nil? and constant.is_a? Class and constant.superclass == ActiveRecord::Base
        description.gsub!(/#{constant}/, constant.model_name.human)
      end
    end
    # テスト実行時に発生した例外を取得する
    exception = self.example.exception

    if exception
      worksheet.add_row([description, 'x'], :style => font2.value)
    else
      worksheet.add_row([description, 'o'], :style => font1.value)
    end
  end

  # テスト実行後に xlsx ファイルを保存する
  config.after(:suite) do
    excel.use_shared_strings = true # for Numbers
    excel.serialize("#{Time.new.strftime("%Y-%m-%d-%H:%M:%S")}_test_report.xlsx")
  end

  Dir.glob("spec/**/*steps.rb") { |f| load f, true }

  require 'capybara/dsl'
  require 'capybara/rspec'
  require 'capybara/webkit'
#  require 'capybara/poltergeist'
  require 'rspec/rails'
  require 'rspec/autorun'
  require 'turnip'
  require 'turnip/capybara'
  Capybara.default_driver = :selenium

spec/features/login.featureにシナリオを書く
  Feature: ポータル画面からログイン
  Scenario: トップページが正しく表示されることを確認
    When トップページを表示する
    Then QAポータルと表示されていること
    Then ログインと表示されていること

  Scenario: トップページからログインする
    When トップページを表示する
    Then idとpasswordを入力する
    Then ログインボタンをクリックする
    Then 画面にユーザ一覧が表示されていること
    Then ユーザ一覧をクリックする
    Then 所属会社と表示されていること

  Scenario: トップページからログインしてログアウトする
    When トップページを表示する
    Then idとpasswordを入力する
    Then ログインボタンをクリックする
    Then 画面にユーザ一覧が表示されていること
    Then ログアウトをクリックする
    Then ログインと表示されていること
spec/steps/login.steps.rbにソースを書く
#encoding: utf-8
step "トップページを表示する" do
  visit 'http://localhost:3000/users/sign_in'
end

step "QAポータルと表示されていること" do
  expect(page).to have_content('QAポータル')
end

step "ログインと表示されていること" do
  expect(page).to have_content('ログイン')
end

step "idとpasswordを入力する" do
  fill_in 'user_email', :with => 'joji.urano@gree.net'
  fill_in 'user_password', :with => 'akagisigeru'
end

step "ログインボタンをクリックする" do
  click_button "ログイン"
  sleep 1
end

step "画面にユーザ一覧が表示されていること" do
  expect(page).to have_content('ユーザ一覧')
end

step "ユーザ一覧をクリックする" do
  click_link "ユーザ一覧"
  sleep 1
end

step "所属会社と表示されていること" do
  expect(page).to have_content('所属会社')
end

step "ログアウトと表示されていること" do
  expect(page).to have_content('ログアウト')
end

step "ログアウトをクリックする" do
  click_link "ログアウト"
  sleep 1
end

step "ログインと表示されていること" do
  expect(page).to have_content('ログイン')
end
テストコマンドで実行
rspec -r turnip/rspec spec/features/login.feature 

2013年11月22日金曜日

Railsでrspecを使う

Gemfileの設定
group :development do
  gem "rspec"
  gem "rspec-rails"
  gem "mocha"
end
  bundle install
  rails g rspec:install
  vi spec/spec_helper.rb
コメントアウト
  config.mock_with :mocha
mochaをinstallするのがわからなくて、ずっとこんなエラーが出てた。
 `require': cannot load such file -- mocha/standalone (LoadError)

2013年11月20日水曜日

Railsで親子関係のモデルのsave時にtransactionをする

こんな関係の時に、トランザクションを使って、どう更新するか?
class User < ActiveRecord::Base
  has_many :projects
end

class Project < ActiveRecord::Base
  belongs_to :user
  #nameというカラムを持っています。
end
バリデーションに引っ掛かった場合は例外をthrow。
DBの更新時にエラーが発生した場合も例外をthrow。
例外の種類によって、メッセージを分けたい場合は、rescueを追加してもいいかもしれません。
  def update
    begin
      @user = User.find(params[:id])
      @user.valid? #validation throw ActiveRecord::RecordInvalid
      Project.transaction do
        @user.update_attributes!(params[:user])
        @user.projects << Project.new(name: "test_name")
      end
      respond_to do |format|
        format.html { redirect_to @user, notice: t("general.success_update") }
      end
    rescue
      respond_to do |format|
        format.html { render action: "edit" }
      end
    end
  end

Railsのモデルのバリデーションを新規登録、更新ごとに定義する

updateの時だけvalidationを行いたい時の対処方法
Modelの中
create, update, saveを選択できる。saveがデフォルト。
class User < ActiveRecord::Base
  validates :name, :presence => { :on  => :update }
end

2013年11月19日火曜日

rake db:migrateのオプション

指定されたバージョンまで全て実行
versionの番号はmigrateファイルの数字部分
  rake db:migrate VERSION=20131118080021
指定ステップだけバージョンを戻す
  rake db:rollback STEP=1
指定されたバージョンファイルだけを実行(upメソッド)
  rake db:migrate:up VERSION=20131118080021
指定されたバージョンファイルだけを実行(downメソッド)
  rake db:migrate:down VERSION=20131118080021
指定ステップだけバージョンを戻して、再度実行
  rake db:migrate:redo VERSION=20131118080021
データベースをいったん削除し、再作成の上で、最新のスキーマを再構築
  rake db:migrate:reset
現在のマイグレーションの番号を表示
  rake db:version
データベースの文字コードを表示
  rake db:charset
実行していないマイグレーションを表示
  rake db:abort_if_pending_migrations

2013年11月15日金曜日

Railsでタグ機能を作成する。

タグ機能の実装を考えてみる。
モデル構成はこんな感じ。
UserとProjectがm:n
ProjectHistoryが中間テーブル。has_and_belongs_to_manyでもいいぐらいのテーブル
Userが複数のProjectというタグを持つイメージ
また、一つのタグは複数のユーザーにも共有される。
使用したjavascriptは
jquery.tagsinput.js
jquery-ui.js
オートコンプリート機能つきです。
ソースコードは、どうでもいいところは省略しています。

class User < ActiveRecord::Base
  has_many :project_histories
  has_many :projects, :through => :project_histories

  attr_accessor :project_tags
end
class ProjectHistory < ActiveRecord::Base
  attr_accessible :project_id, :user_id
  belongs_to :user
  belongs_to :project
end
class Project < ActiveRecord::Base
  attr_accessible :name
end
users_controllerの実装
def new
  @user = User.find(params[:id])
end

def create
  @user = User.new
  project_tags = params[:user].fetch("project_tags")
  params[:user].delete("project_tags")
  Project.transaction do
    tags = project_tags.split(",").uniq
    tags.each do |v|
      @user.projects << Project.new(name: v)
    end
  end

  respond_to do |format|
  
  end
end

def edit
  @user = User.find(params[:id])
  @user.project_tags = @user.projects.map(&:name).join(",")
end

def update
  @user = User.find(params[:id])
  project_tags = params[:user].fetch("project_tags")
  params[:user].delete("project_tags")
  Project.transaction do
    @user.projects.clear
    tags = project_tags.split(",").uniq
    tags.each do |v|
      pro = if Project.find_by_name(v)
        Project.find_by_name(v)
      else
        Project.new(name: v)
      end
        @user.projects << pro
    end
  end

  respond_to do |format|
    if @user.update_attributes(params[:user])
      format.html { redirect_to @user, notice: 'User was successfully updated.' }
      format.json { head :no_content }
    else
      format.html { render action: "edit" }
    end
  end
end
API用のprojects_controllerの実装
def index
  @projects = Project.find(:all, :conditions => ["name LIKE ?", "%"+params[:term]+"%"])
  val = []
  @projects.each do |project|
    v = {}
    v[:value] = project.name
    val << v
  end
  respond_to do |format|
    format.json { render json: val }
  end
end
_form.html.erbの実装
<%= simple_form_for(@user) do |f| %>
  <%= f.input :project_tags %>
  
<%= f.submit(:class => "btn btn-primary") %>
<% end %>

Railsとbootstrap3でのデザイン

bootstrap2だとLayoutsという項目があったのに、bootstrap3では無くなって
困った人って俺だけ?そんなわけで簡単なレイアウト構成
所謂、ベーシックなデザインです。 layouts/application.html.erbのソース

  • Cras justo odio
  • Dapibus ac facilisis in
  • Morbi leo risus
  • Porta ac consectetur ac
  • Vestibulum at eros
<%= yield %>

RailsでLike検索

Like検索ってどうやるんだっけ?
みたいなのに無駄に時間をかけないように。
  Project.find(:all, :conditions => ["name LIKE ?", "%"+params[:term]+"%"])

2013年11月13日水曜日

Railsでpagerを実装する

  gem 'kaminari'
  bundle install
Controller内
  def index
    @categories = Category.page params[:page]

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @categories }
    end
  end
Model内
  paginates_per 5 #1ページを何行にするかの設定
View内
  <%= paginate(@categories) %>
上記の例はDBのlimitを使ったページャーですが、配列のページャーも対応しているようです。
Kaminari.paginate_array(my_array_object).page(params[:page]).per(10)

2013年11月12日火曜日

Railsのメッセージを簡単に翻訳

  vi config Gemfile
  gem 'rails-i18n'
  bundle install

2013年11月11日月曜日

Railsとtwitter bootstrap,simple_formで簡単デザイン

vi Gemfile
group :assets do
  gem 'sass-rails',   '~> 3.2.3'
  gem 'less-rails'
  gem 'coffee-rails', '~> 3.2.1'
  gem 'twitter-bootstrap-rails'
  gem 'simple_form'
  gem 'therubyracer', :platforms => :ruby
  gem 'uglifier', '>= 1.0.3'
end
bundle install
rails g bootstrap:install
rails g bootstrap:layout application fluid
rails generate simple_form:install --bootstrap
rails g bootstrap:themed Model名の複数形

RailsのI18nの設定

http://localhost:3000/ja/admin/users
例えば、こんな感じでRESTFULなURLでロケール情報を渡したい。

controllerを修正します。
default_url_optionsの設定は、全てのリンクに自動的にロケールを追加するためです。
 vi app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  protect_from_forgery
  before_filter :detect_locale

  def default_url_options(options = {}) 
    { :locale => I18n.locale }
  end 

private
  def detect_locale
    I18n.locale = params[:locale]
  end 
end

ルーティングも変更します。
  vi config/routes.rb

今までのroutingをscopeで囲みます。
scope "/:locale" do
  devise_for :users
  namespace :admin do
    resources :users
  end
end

match '/:locale' => 'home#index'
root :to => 'home#index'
切り替えるスイッチはこんな感じで。
  <% if params[:locale] == "ja" %>
    <%= link_to(t("general.en"), root_path(:locale => "en")) %>
  <% elsif params[:locale] == "en" %>
    <%= link_to(t("general.ja"), root_path(:locale => "ja")) %>
  <% end %>

Railsのコントローラーをディレクトリでわけたい。

Railsのコントローラーを作成していて、Admin用のcontrollerと普通のcontrollerを分けたい時の話です。
admin/users_controller
admin/clients_controller

users_controller
clients_controller
みたいに構造を分けたい場合
以下のコマンドで解決できます。
rails g controller Admin::Users
create  app/controllers/admin/users_controller.rb
invoke  erb
create    app/views/admin/users
invoke  rspec
create    spec/controllers/admin/users_controller_spec.rb
invoke  helper
create    app/helpers/admin/users_helper.rb
invoke    rspec
create      spec/helpers/admin/users_helper_spec.rb
invoke  assets
invoke    coffee
create      app/assets/javascripts/admin/users.js.coffee
invoke    scss
create      app/assets/stylesheets/admin/users.css.scss
URL側にも対応
 vi config/routes.rb
namespace :admin do
  resources :users
end