複数ファイル内の置換
複数ファイルを一度に置換したくて使っているコマンドです。 railsのroutes.rbを修正して、ルーティングヘルパが変わったので一斉に置換しました。
find . -type f -print0 | xargs -0 sed -i -e “s/info_salutation_path/salutation_path/
macOSの場合は、iオプションの挙動が違うので注意です。
参考
tmux : unknown option: status-utf8というエラーメッセージ
warningがでていたので、tmux.confを更新した。
status-utf8 has been removed after version 2.2.
ということで、setw -g status-utf8 on;
を削除しましょう。
参考
constraintsの利用について
後輩にvimの折り畳み開閉のショートカットキーを聞かれてて、忘れてたのに落ち込んだり、
参加したセミナーでテストコードに関する有益な話を聞けてほっこりしてます。
コミュ力って重要。
Railsのroutes.rbで、ルーティングを無条件で利用すると、public下の置いているファイルとルーティングが当たってしまうので、
これを回避するためにURIを変えるか。制限を入れるかを考えていて、制限を入れることにしました。
constraints
を使って定義する。
環境
constraints
定義したルーティングに制限を追加することできます。
# config/routes.rb Rails.application.routes.draw do get 'users/:user_id' => 'users#show', constraints: /\d+/ end
これは、ブロックも利用できて、複数のルーティングに制限を加える際に利用できる。
Rails.application.routes.draw do constraints /\d+/ do get 'welcome/:id' => 'welcome#show' ... end end
今回は、DBの値を利用した制限を追加する形で実装を進めていてconstraints
のファイル保存場所について
app
を検討したが、ひとまずlib
に保存しています。
まず、lib/autoload
を起動時に自動で読み込むようにします。
# config/application.rb ... config.autoload_paths += %W(#{Rals.root}/lib) ...
# lib/autoload/constraints/zone_constraint.rb class ZoneConstraint def matches?(request) paths = request.path_info&.split('/')&.reject(&:blank?) paths.size.times do |i| case i when 0 fail if ExampleA.find_by(key: areas[i]).blank? when 1 fail if ExampleB.find_by(key: areas[i]).blank? when 2 fail if ExampleC.find_by(key: areas[i]).blank? else fail end end true rescue false end end
最後にroutes.rbに制限を加えます。
# config/routes.rb constaints ZoneConstraint do get ':example_a/:example_b/:example_c' => 'example#index ... end
データベースに保存されていない場合、ルーティングを参照しないようにします。
参考
Rails3 事始め: [Rails3] 現在のURLを取得(request オブジェクト)
rails routing constraintsについて | 日々雑記
friendly idを利用したURI設計
プロジェクトでSEO対策と数値を含めずにURIを設計するため、friendly_idを採用してURIの再設計をしました。
railsではURIにmodelの主キーを含める形の設計が主になりますが、数値では分かりづらくなります。(resourceでは作成されませんが)
それほど複雑な仕様でもないため、gemを使わず、参照しているmodelのnameカラムがありましたので英語名を追加することで実現しました。
サンプルコードは、実際に実装したコードとは異なります。
環境
Rails appの作成
# rails new friendly_app # cd friendly_app # ./bin/rails g scaffold users name_en:string # ./bin/rails db:migrate
実装
app/models/user.rb
に、id
ではなくname_en
を利用するように書き換える。
# app/models/user.rb モデルに'#to_param'を追記する。 class User < ApplicationRecord validates :canonical_name, uniqueness: { case_sensitive: false }, format: { with: /\A[A-Za-z][\w-]\z/ }, length: { minimum: 3, maximum: 25 } def to_param name_en ? name_en : id.to_s end def self.find(input) find_by(name_en: input) || super end end
rails s
app serverを起動して。
# ./bin/rails s
動作確認
users/new
でユーザを作成する。users/:name_en
に移動する。
まとめ
route.rbがresources
のままになっており
params[:id]でname_en
の値を受け渡すことになりわかりずらくなるので、idを受け渡さない画面ではroute.rbを変更しました。
参考URL
Friendly URLs in Rails · GitHub
Rspecでseeds.rbをリセット時に読み込む。
プロジェクトにrspecとfactory girlのgemを追加して seeds.rbを読み込んでから、毎回テストを起動したかったのでこのあたりをまとめておく。
環境
rspecとfactory girlの導入
まずは、Gemfileにrspec_rails
とfactory_girl_rails
を追加してbundle install
します
# Gemfileにgemを追加 group :development, :test do gem 'rspec_rails' gem 'factory_girl_rails' end group :test do gem 'database_clear' end
bundle install
rspec install
$ rails g rspec:install
環境別のseedを作成する
これはRails.env.hoge?
で切り分ければ、seeds.rbにまとめることもできる。
env毎のファイルを作成する。
mkdir db/seeds touch db/seeds/test.rb touch db/seeds/development.rb touch db/seeds/production.rb
db/seeds/test.rb
とdb/seeds/development.rb
に記述を追加
values = { email: 'hoge@example.com'... } # attriubutesを設定する。 Admin.create(values)
seeds.rb
に下記のコードを追加。
load(Rails.root.join( 'db', 'seeds', "#{Rails.env.downcase}.rb"))
テスト時にdbをリセットして、seedsを読み込む。
#clean_with
の引数に、exceptでクリーンにしないmodel名を記述することもできます。
config.before(:suite) do load Rails.root.join('db', 'seeds.rb') DatabaseCleaner.clean_with :truncation # DatabaseCleaner.clean_with :truncation, { except: %w(categories brands) } end
参考URL
もくもく会を主催した感想
kikedaです。 先日(1/10)にもくもく会を主催しました。
もくもく会に参加することはしばしばありましたが、主催する側になるのは初めてで、 開催してみて気になることや、反省点がありましたので、ずらずらと書いていきたいと思います。
(ちなみにだれかを批判するつもりはありません。)
集合時間がやや遅れる。
これは、参加するとき僕もよく遅刻していました。 主催する場合、会場を開く時間と自己紹介の時間をずらしておくといいかもしれませんね。
だれがなにをしているのかわからない。
途中で参加される方で、質問できるならしたかったけれども、だれがなにを知っているのかわからなかったとのこと。これは上記の自己紹介の時間をずらすことや、テキストによる共有や、チャットを準備することで解決しようかなと考えています。
質問できると助かる。
これは、自分のもくもく会の方向性で、経験者枠と未経験者(学生、プログラミング歴が浅い)などの枠で分けて、質問に答えられる方と分けることも考えていました。ただ、言語のしばりがなく、集まっている方の技術レベルが明確にならない以上(なおかつ、そういういった対応を極力したくない場合、自分がもくもくするために来ているため)、絶対数を確保するのは「もくもく会」という形だと実現できないかなと思っています。そもそもできている会については良いと思います。
僕は、もくもく会を1人で作業するよりか複数人で作業するほうが捗るという趣旨に賛同して開催しています。その個人個人がもくもく作業できるのが理想かなぁと思っていて、それでも時間を割いて、参加者の中で質問を受け付けていても構わない方で、扱える言語を調べて、サポートするのが自分の主催するもくもく会でできることだと思いました。
また開催して欲しいという声について
定期的に開くというのが、義務みたいになってしまうと感じていまして、自分のやりたいときに、開こうと思っています。
今後のもくもく会について
不特定多数の人たちが集まって、その中の人達で、質問したり、回答したりしていくことが自然かなぁと思っていまして、できる限りそれをコミュニティの運営方法でカバーできないかなと考えています。
良い方法や、知識があれば今後、もくもく会に適用していきたいですし、もくもく会の方向性も固めていきたいと思っていますので、参加者の方々、また開催する際には、楽しんでもくもくもらえれば嬉しいかぎりです。
ではでは。
PHPのempty関数
備忘録ですね。自分のローカルの環境では、エラーが発生しなかったのですが、他の方の環境ではエラーになり、対応しました。
環境
- codeigniter 2.2
- PHP 5.5系
empty関数
引数が空であるかを評価して、true/falseを返却する関数です。 ただし、issetなどの変数を評価する関数と引数により返す値が変わりますので、そのあたりの細かい知識は前提として持っておいたほうが良いです。
エラーになった際のコード。サンプルです。
if (empty(set_value('domestic', 'hoge')) { echo 'true'; }
修正コード
$value = set_value('domestic', 'hoge'); if (empty($value)) { echo 'true'; }
以上で、動作します。