うまとま君の技術めも

2015年新卒入社した社畜の勉強内容などなど

Railsでf.selectにclassが設定できない時

環境

f.select

<%= form_for @user do |f| %>
  ...
  <%= f.select :job, { engineer: "Engineer", ... }, class: "myclass" %>
  ...
<% end %>

ここでセレクトタグに.myclassが設定されていることが期待されるが、 実際に生成されるHTMLは下記のようになる。

<select id="user_job" name="user[job]">
  <option selected="selected" value="engineer">Engineer</option>
  ...
</select>

classが設定できない時の対処法

<%= form_for @user do |f| %>
  ...
  <%= f.select :job, { engineer: "Engineer", ... }, {}, { class: "myclass" } %>
  ...
<% end %>

これでclassが設定されたHTMLが出力されるはずです。

<select class="myclass" id="user_job" name="user[job]">
  <option selected="selected" value="engineer">Engineer</option>
  ...
</select>

参考

Railsでdefault_scopeの解除方法

環境

default_scopeの設定方法

orderwhere文などをdefault_scopeメソッドに渡してあげればおk

class User < ActiveRecord::Base
  ...
  default_scope { order(email: :asc) }
  default_scope { where(deleted_at: nil) }
  ...
end

orderの解除方法

reorderorderのみ解除できる。

User.all
    #=> "SELECT `users`.* FROM `users` WHERE `users`.`deleted_at` IS NULL  ORDER BY `users`.`email` ASC"
User.reorder(nil)
    #=> "SELECT `users`.* FROM `users` WHERE `users`.`deleted_at` IS NULL
User.reorder(id: :desc)
    #=> "SELECT `users`.* FROM `users` WHERE `users`.`deleted_at` IS NULL  ORDER BY `users`.`id` DESC"

特定のscopeの解除方法

exceptまたはunscopeで解除することが出来る。
unscopeの方はexceptよりも細かい設定をすることが出来るようです。

User.all
    #=> "SELECT `users`.* FROM `users` WHERE `users`.`deleted_at` IS NULL  ORDER BY `users`.`email` ASC"
User.except(:order)
User.unscope(:order)
    #=> "SELECT `users`.* FROM `users` WHERE `users`.`deleted_at` IS NULL
User.except(:where)
User.unscope(:where)
User.unscope(where: :deleted_at)
    #=> "SELECT `users`.* FROM `users`  ORDER BY `users`.`id` DESC"

感想

今回は環境がRails4だったのでRails3などでは結果が違うかもしれないですね。

参考

Macで作るLaravel 4.1 開発環境

環境

  • OS X 10.9.2
  • Homebrew 0.9.5
  • PHP 5.5
  • Laravel 4.1

PHP 5.5 をインストール

$ curl -s http://php-osx.liip.ch/install.sh | bash -s 5.5

pathを追加する

$ vim ~/.bash_profile
export PATH=/usr/local/php5/bin:$PATH

設定ファイルを反映させる

$ source ~/.bash_profile
$ php -v
PHP 5.5.12 (cli) (built: May 17 2014 15:21:52)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2014, by Zend Technologies
with Xdebug v2.2.3, Copyright (c) 2002-2013, by Derick Rethans

php_mcryptのインストール

brewphp_mcryptをインストール

$ brew install mcrypt

composerのインストール

$ curl -sS https://getcomposer.org/installer | php -d detect_unicode=Off
$ mv composer.phar /usr/local/bin/composer
$ composer --version
Composer version 0c343f925ad578a9da4d9a4cfff4e91b500d206c 2014-05-14 09:25:20

Laravelのプロジェクトを作成

適当なディレクトリにプロジェクトを作成

$ composer create-project laravel/laravel myapp --prefer-dist
$ cd myapp
$ php artisan serve

http://localhost:8000にアクセスして下記画面が表示されていればおk

laravel_welcome

参考

UbuntuにMySQLをインストール

環境

mysqlをインストール

まずはインストールされるバージョンを確認
まだ5.6は登録されていないみたいですね。

$ sudo apt-get update
$ apt-cache show mysql-server | grep Version
Version: 5.5.37-0ubuntu0.12.04.1
Version: 5.5.22-0ubuntu1

aptでインストール

$ sudo apt-get install mysql-server
$ mysql --version
mysql  Ver 14.14 Distrib 5.5.37, for debian-linux-gnu (x86_64) using readline 6.2

設定

設定ファイルはバックアップしておきましょう

$ cd /etc/mysql
$ cp my.cnf my.cnf.org

文字コードなどを設定

$ sudo vi my.cnf

下記を追記

[client]
default-character-set = utf8

[mysqld]
skip-character-set-client-handshake
character-set-server  = utf8
collation-server      = utf8_general_ci
init-connect          = SET NAMES utf8

設定を反映させるためmysqlを再起動

$ sudo service mysql restart

mysqlにログイン

$ mysql -u root -p

ステータスをチェック

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

Connection id:          37
Current database:    
Current user:           root@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         5.5.37-0ubuntu0.12.04.1 (Ubuntu)
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:            /var/run/mysqld/mysqld.sock
Uptime:                 19 min 17 sec

Threads: 1  Questions: 112  Slow queries: 0  Opens: 171  Flush tables: 1  Open tables: 41  Queries per second avg: 0.096
--------------

起動、停止、再起動

$ sudo service mysql start
$ sudo service mysql stop
$ sudo service mysql restart

プロセスの確認

$ ps aux | grep mysqld
mysql    1461  0.0  4.2 492564 42912 ?        Ssl  06:40   0:00 /usr/sbin/mysqld
hoge     3372  0.0  0.0  14572   948 pts/0    S+   06:51   0:00 grep --color=auto mysqld

MySQLGUIで管理

$ sudo apt-get install mysql-workbench

参考

Nginx, Unicornで作るRailsアプリ

環境

Railsアプリ

Railsはインストール済みとする。

とりあえず適当にプロジェクトの作成

$ rails new blog

nginxのインストール

aptでnginxの公式リポジトリを使うように設定する。

$ sudo vi /etc/apt/sources.list.d/nginx.list

nginx.listに下記を追記

deb http://nginx.org/packages/ubuntu/ precise nginx
deb-src http://nginx.org/packages/ubuntu/ precise nginx

PGP公開鍵を追加する必要があるらしい

$ curl http://nginx.org/keys/nginx_signing.key | sudo apt-key add -

インストール可能なバージョンを確認

$ sudo apt-get update
$ apt-cache show nginx | grep Version
Version: 1.4.7-1~precise  ## 最新のバージョンが確認できればおk
Version: 1.1.19-1ubuntu0.6
Version: 1.1.19-1ubuntu0.5
Version: 1.1.19-1

nginxのインストール

$ sudo apt-get install nginx
$ nginx -v
nginx version: nginx/1.4.7

nginxの設定
/etc/nginx/conf.d/default.conf

upstream backends {
    server 127.0.0.1:3000;
}

server {
   listen 80;
    server_name localhost;

    location / {
        if (-f $request_filename) { break; }
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_pass http://backends;
    }
}

Unicornのインストール

Gemfileにunicornを追加

gem 'unicorn'

bundleでサクッとインストール

$ bundle install

設定ファイルの作成
config/unicorn.rb

# config:utf-8
# unicorn.rb

# process count
worker_processes Integer(ENV["WEB_CONCURRENCY"] || 4)

# 15秒でWorkerをkillしてタイムアウト
timeout 15

# trueにしておくとダウンタイムが発生しないらしい
preload_app true

# 使用するポート番号を指定
listen 3000

# Capistranoを使うときに設定
pid "/path/to/rails/tmp/pids/unicorn.pid"

# ログの設定
stderr_path File.expand_path('log/unicorn.log', ENV['RAILS_ROOT'])
stdout_path File.expand_path('log/unicorn.log', ENV['RAILS_ROOT'])

before_fork do |server, worker|
    old_pid = "#{server.config[:pid]}.oldbin"
    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

    defined?(ActiveRecord::Base) and
        ActiveRecord::Base.connection.disconnect!
end

after_fork do |server, worker|
    Signal.trap 'TERM' do
        puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT'
    end

    defined?(ActiveRecord::Base) and
        ActiveRecord::Base.establish_connection
end

def rails_root
    require "pathname"
    Pathname.new(__FILE__) + "../../"
end

taskの作成
lib/tasks/unicorn.rake

namespace :unicorn do

    # Tasks

    desc "Start unicorn"
    task(:start) {
        config = rails_root + "config/unicorn.rb"
        env = ENV['RAILS_ENV'] || "development"
        sh "bundle exec unicorn_rails -D -c #{config} -E #{env}"
    }

    desc "Stop unicorn"
    task(:stop) { unicorn_signal :QUIT }

    desc "Resta unicorn with USR2"
    task(:restart) { unicorn_signal :USR2 }

    desc "Increment number of worker processes"
    task(:increment) { unicorn_signal :TTIN }

    desc "Decrement number of worker processes"
    task(:decrement) { unicorn_signal :TTOU }

    desc "Unicorn pstree (depends on pstree command)"
    task(:pstree) do
        sh "pstree '#{unicorn_pid}'"
    end


    # Helpers

    def unicorn_signal signal
        Process.kill signal, unicorn_pid
    end

    def unicorn_pid
        begin
            File.read(rails_root + "tmp/pids/unicorn.pid").to_i
        rescue Errno::ENOENT
            raise "Unicorn doesn't seem to be running"
        end
    end

    def rails_root
        require "pathname"
        Pathname.new(__FILE__) + "../../../"
    end

end

unicorn起動

$ rake unicorn:start

動作確認

http://localhost/ にアクセスできればおk

その他

参考

間違えてユーザーの所属グループを上書きしてしまった時

環境

所属グループが消えとるんだが(;´Д`)

よしhogeユーザーをnewgrpグループに追加しようと思い、下記コマンドを実行した

$ usermod -G newgrp hoge

その後に、sudoを使ったら何故かpermission denyとか言って怒られる。
何故だろうと思い$ id -aで所属グループを確認したらnewgrp以外消えとるんだが(;´Д`)

どうやら$ usermod -G ...だとグループの追加ではなく上書きで変更するらしい。
そんな事知らずに今まで使ってたんだが…

そんな訳で、一旦recovery modeでログイン
最初に登録されていたグループ一覧は

$ cat /etc/group- | grep hoge

で確認できるはず。

$ mount -o rw,remount /  ## これをしとかないと次のコマンドを実行できないよ
$ usermod -G adm,cdrom,...,plugdev hoge

これで、グループが元に戻せるはず。

ユーザーの所属グループを追加したいとき

$ gpasswd -a hoge newgrp

これでいけるらしい。

参考

初めてのRuby on Rails

目的

Railsをインストールして動作確認する

環境

環境の確認

$ ruby -v
ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-darwin13.0]

$ gem -v
2.2.2

Railsのインストール

Gemを使ってRailsをインストール

$ gem install rails
$ rbenv rehash  ## rbenvを使っているので更新を反映
$ rails -v
Rails 4.0.4

Railsアプリケーション

Railsアプリを新規作成しサーバーを起動する。
ちゃんと起動できていれば http://localhost:3000/ にページが表示されるはず。

$ rails new blog
$ cd blog
$ rails server  ## サーバー起動

参考