rails

Rails クイズ: 次のコードで rollback されるのはどれでしょう?

先日、仕事のコードで遭遇して「なんだこの動き...」と思ったので、ブログに書いておく。 Rails クイズ: 次のコードで rollback されるのはどれでしょう?(配点10点) 常にバリデーションエラーになるモデル Bomb と no 属性によってコールバックを制御できる…

2017年 OmniAuth で Qiita 連携を作る際の現状まとめ

Rails で OAuth 連携の機能を作う場合、一般的に OmniAuth を使うことになります。 そして、 OmniAuth の Qiita Strategy が3つあったので、それぞれ状況をまとめました。 各 gem の概要 GitHub rubygems version work? tmiyamon/omniauth_qiita omniauth_qi…

Ruby/Rails の勉強方法について #omotesandorb

6/1(木) の表参道.rb でLTしてきました。 omotesandorb.connpass.com 資料 「他人がどうやって Ruby/Rails を学んできたのか?」って意外と聞く機会は無いと思うので、自分のふりかえりも兼ねて発表してみました。資料は Qiita で公開してます。 qiita.com …

Rails アンチパターン - 錆びついたファクトリー (factory_girl)

技術書典は書く側で参加したい気持ちはあるけど、書くネタと書く時間があるかどうか…— 神速@リリカルエンジニア (@sinsoku_listy) 2017年4月9日 あー、自分の知ってるRailsアンチパターンとか書きたいかも。自分の犯した罪(アンチパターン)を贖罪したい…。— …

個人 Rails アプリを CircleCI 2.0 で動くようにした

CircleCI 2.0 が使えるようになっていたので、アップグレードしておいた。 CircleCI の設定 今まで circle.yml だったけど、 .circleci/config.yml に変わっている。 Ruby の設定例は Language Guide: Ruby があるので、これを参考にすると良い。 version: 2…

Rails で gem を導入するときに最低限やること

普通にみんなやっていることだと思うけど、自分が gem を入れるときに最低限やることをまとめてみた。 何かしらの方法で探してきた gem を「導入するかどうか」の判断をするときにやることです。 やること一覧 今後もメンテされそうかを調べる README を 全…

rake notes で TODO が増え過ぎたら CI で検知できるように拡張する

Rails アプリから機能を gem 化する方法の実例を1つ公開してみる。 sinsoku.hatenablog.com rake notes を拡張する rake notes で Rails アプリ内の "OPTIMIZE|FIXME|TODO" を一覧表示できるが、これを拡張する。 ソースコードの探し方 rails/rails のリポジ…

Rails アプリから汎用的な機能を gem 化する方法

これから Rails 用の gem を作ってみたい人向けの内容。 gem 化する 実は下記のようなコードを置くだけで RubyGems に登録しなくても、 gem として認識される。 Gemfile gem 'hello_world', path: 'lib/hello_world' lib/hello_world/hello_world.gemspec # …

Rails の link_to_if にブロックを渡したときの挙動が分かりにくいので注意

Rails の link_to_if にブロックを渡したときの挙動が分かりづらいので、使う場合の注意点をまとめてみました。 TL;DR ブロックの内容を条件によってリンクにしたい場合は capture を使うのがシンプルで良いです。 <% body = capture do %> <%= image_tag 'i…

Rails でパラメータを別モデルにして、バリデーションできるようにする

ブログをサボりすぎているので、備忘録でも書くようにしておく。 やったこと ちょっと詳細書くのが難しいんだけど、処理自体を抽象化して扱おうとしたら、こうなった。 module Task class Base attr_reader :args def self.arguments(&block) klass = Class.…

Ruby で SSH 鍵を生成する方法

Rails で Web 上から SSH 鍵を生成したくなったけど、方法がなかなか見つからなかったから書いておく。備忘録。 コード Gemfile に gem 'net-ssh' を追加して、↓みたいなモデルを作ればうまくできた。 class SslKey < ActiveRecord::Base belongs_to :user v…

Heroku で Sidekiq を使おうと思ったら Error fetching job: ERR max number of clients reached が出た話

Heroku で mperham/sidekiq を使おうと思ったら、 Error fetching job: ERR max number of clients reached が大量に出るようになってしまいました。 ログがいっぱいになり、Sidekiq.❨╯°□°❩╯︵┻━┻ したくなった。 エラーの原因 今回、 Heroku Redis の hobby…

Rails の Routing で get や match を効果的に使う方法

Rails では Resource Routing: the Rails Default とあり、基本的には resources もしくは resource を使います。 では、 get や match はどういう時に使うのか? について、私が使ってる例を3つ紹介します。 1. gem などで使う場合 intridea/omniauth のよ…

Rails で RESTful Web API をシンプルに保つ設計

Rails で RESTful な Web API を作る場合、色々な方法があると思います。 今回、私が API を作るときによくやっている設計をブログに書いてみます。 コード 説明するより、コードを見てもらった方が早いと思うので、コードを書く。 # config/routes.rb names…

gemのバグを踏んだときにどうやって立ち向かうのか

最近、 colszowka/simplecov のバグを踏みました。 こうやって 不運にもバグを踏んでしまった 運よくOSSに貢献できるチャンスを得てしまったときの原因調査の方法などを紹介します。 今回のバグ simplecov はカバレッジ率を計測するgemで、以前から便利に使…

rubocop v0.35.1 でruby 2.3のSafe navigation operator(&.) を使うとunexpected token tDOTが発生する

タイトルの通り、 &. を使うとエラーが出てたので対応方法を紹介します。 Inspecting 1 file E Offenses: app/models/user.rb:11:21: E: unexpected token tDOT user.piyo if user&.admin? ^ 1 file inspected, 1 offense detected 対応 1 bbatsov/rubocop …

rake notesを使ってTODOが多くなったらCIで検知する

コード内で長い年月熟成されたTODOに頭を抱えているRailsエンジニアの方々、お疲れ様です。 これ以上のTODOが生まれないように、CIで検知するためのコード書いたので、参考にどうぞ。 参考 rails/source_annotation_extractor.rb at master · rails/rails ht…

ActiveRecord::Callbacks をfactory_girlで綺麗にstubする方法

ActiveRecord::Callbacks は便利なのですが、テストでモデルを作るたびにメール送信の処理が動いたり、別モデルが生成されると困る。 このあたりをthoughtbot/factory_girlを使って綺麗に書く方法を紹介します。 コード FactoryGirl.define do factory :user…

Railsで開発しているときにrakeのデフォルトタスクを [:rubocop, :rspec] にする

小ネタ。 Rakefile if Rails.env.development? require 'rubocop/rake_task' RuboCop::RakeTask.new task(:default).clear task default: [:rubocop, :spec] end rspec/rspec-railsによって、defaultが指定されているので一度削除してから再設定してます。 …

OmniAuthを拡張して、ストラテジの一覧を取得する

intridea/omniauth はFacebook, Twitter, GitHub, など色々なストラテジに対応しています。 List of Strategies を見ると、とても多いのが分かると思います。 OmniAuth.strategies 自分のアプリで対応しているストラテジ*1の一覧は OmniAuth.strategies で取…

Devise+OmniAuthで複数サービスから同じユーザーでログインする方法

plataformatec/devise と intridea/omniauth を使って、Twitterでも、Facebookでも、GitHubでもログインできるような機能を作る方法を書いておく。 最初に devise には Omniauthable という「これ使えば簡単に実装できるよ!」って雰囲気のmoduleがいます。 …

RailsでDBのスキーマからvalidationを自動生成するpretty_validationというgemを作りました

タイトルの通りですが、作りました。 sinsoku/pretty_validation これは何? DBのスキーマからvalidationを自動生成します。 validates_presence_of (NOT NULL制約から生成) validates_numericality_of (columnの型から生成) validates_uniqueness_of (UNIQU…

mini_style というgemを作りました #fwbar

Forkwell Bar #4 で mini_style というgemを作りました。 インストール方法 Gemfileに mini_style を入れて、 bundle install で入ります。 何ができる? 手抜きして、README.md からコピペ。 style('alert') # => 'alert' style('alert', 'alert-danger': !…

GitHubのPullRequestにfast-forward stateを表示するKeepFF

2015/12/31 追記 GitHub の protected branches によって、Pull Requestのブランチにmasterからマージできる仕組みが導入されました。 Pull Request として出したブランチをrebaseするという操作は推奨されない方法な気がするので、KeepFFは終わらせました。…

werckerのmysqlでutf8mb4を使う

werckerでmysqlのutf8mb4を使う方法が分かったのでまとめておく。 参考にしたページ MySQL :: MySQL 5.7 Reference Manual :: 14.12 InnoDB Startup Options and System Variables https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html Rails - …

seedデータをmigrationで差分管理できるgem "JewelSeed" を作りました

railsでは標準だとデータベースに必要な初期値の設定にdb/seeds.rbを使います。 ただ、db/seeds.rbだとデータの追加・変更や、再実行などが難しくなりがちです。 で、この辺りを便利にするgemはThe Ruby Toolboxで探すといくつかあります。 Seed-fu Ruby Too…

マイグレーションファイルをweb上で編集するgem "ponytail" を作りました

ponytail とは? Railsのマイグレーションファイルをweb上で作成したり、web上でマイグレーション・ロールバックを実行できるようにするgemです。 インストール方法 Gemfileの:developmentのgroupにgemを追加し、bundle installしてください。 group :develo…