読者です 読者をやめる 読者になる 読者になる

rails

rails5でautoload問題を解決する

やられましたよ。 rails4 → rails5へのアップデートをしていたのですが、libpathの配下のものが読まれない。 config/application.rb config.autoload_paths += %W(#{config.root}/lib) 問題ないだろ。 そう思っていましたよ。 どうやら、この作業が無効にな…

rails5からはcontrollerテスト書くぐらいなら、requestテストを書くのがいいっぽい

controllerテストいらねみたいな流れだったけど、requestテスト書けって話だったのか。 Rails 3 と 4 において、controller spec の assigns は慣用されてきました。 今回の RSpec 3.5 はマイナーリリースであり、私たちは SemVer に準拠する以上、 既存の c…

rails5ではrender methodをいたるところで使えるようになっている

rails5にアップデートするときに変更されていて、手を加えて変更したので、備忘録として書いておきます。 rails4.2時代のrenderのやり方 下記のように、requestを強引に擬似るような形でやっていました。 class Renderer def renderer controller = Applicat…

mysqlのorder by fieldで指定のID順に並べる

どういった時に使うんだよwwwって思いましたが、使う感じになりました。 select * from icons where id in(4, 5, 6) order by field(id, 5, 4, 6) => mysql> select * from icons where id in(4, 5, 6) order by field(id, 5, 4, 6); +----+----------------…

railsで複合uniqueのvalidationをつけてやる

mysqlとrailsの両方に念のためつけます。 複合uniqueなんて、使うことあるのか?って思っていたけど、必要になりました。 忘れないために書いておきます。 まずは、migrationの書き方からです。 class CreateReactions < ActiveRecord::Migration def change…

has_manyのhas_manyのcountで効率よくパフォーマンスを出す

counter_cacheはできるだけ使いたくないんですよ。 無駄なカラムを持ちたくないということで、頑張りました。 対策としては、最初で全てのcountを手にするのが一番いいですね。 countは重たいので、先に何とかして値を入手したい・・・。 今回のサンプルでは…

クラス変数の注意点

クラス変数なんて、めったに使うことなんてないし、railsで使うならclass_attributeがあるんで、普通は必要ないです。 しかし、よくクラス変数やめろ!なんて言われることが多いと思うので、ここでおさらいしておきます。 クラス変数とは そもそもクラス変数…

mysqlの予約語に気をつけた方がいい

やられました...orz 直接sqlをいじることがなかったのですが、いじった時に気付きました。 mysql> show tables; +-----------------------------------+ | Tables_in_foo | +-----------------------------------+ | categories | | comments | | rankings |…

macのmysqlをupdateしたら、Library not loaded: /usr/local/opt/mysql56/lib/libmysqlclient.18.dylibって出るようになった

なんじゃこりゃーってなりました。 なんだ昔のmysqlを見に行ってるの? そんな古い情報見に行かないでくれよ!って感じだと思います。 原因は、gemの情報で古いmysqlの場所を見に行っているのが原因でした。 gem uninstall mysql2 ここで全てのversionを削除…

railsのmysqlでemojiを使う方法

emojiを使おうと思ったら、色々と問題があるようなので、まとめます。 文字コード問題 collation問題 ハハパパ問題(参考) index問題 mysql側の設定 rails側の設定 文字コード問題 まず、emojiはmysqlのutf8では使用できません。 mysqlでemojiを使用するにはu…

文字列からクラス名にアクセスする方法

constantizeを使用します。 "Topic".constantize => Topic(id: integer, title: string, body: text, category_id: integer, thumbnail_updated_at: datetime, thumbnail_file_size: integer, thumbnail_content_type: string, thumbnail_file_name: string,…

nestしたcontent_tagを書く方法と注意点

nestしたcontent_tagを書く場合です。 concatで連結して書くことができます。 content_tag(:div, class: "c-grid__quotation-image") do concat(image_tag(url)) concat(link_to("出典:#{host_name}", url)) end ただし、こんだけ連結させる場合は、別途ren…

file_fieldに拡張子を制限する方法

今までjs側で処理を行おうとしていました。 普通にhtml属性で設定ができます。 = f.file_field :thumbnail,accept: 'image/jpg,image/jpeg,image/png,image/gif' acceptを使用することで、拡張子が画像系のものしか上げなくできます。 twitterってどうやって…

database cleanerの設定について

rspecのテスト実行時にDatabaseCleanerを使用しています。 データベースを毎回キレイな状態にしてくれるやつですね。 これの何がいいかというと、テストデータが固定化されるのと、増えないのでテストの実行が遅くならないということです。 ただし、設定によ…

viewの条件式を減らす

viewにロジックを書きすぎるな!ってことです。 自戒の意味を込めて書きます。 - if area? && action_name == "show" - if citys? = render "foo" - else = render "bar" - else = render "bar" こういうのがあったとします。 viewにこんだけロジックが積ま…

factory girlのtraitで関連するモデルを作成するのを選択制にする

関連するモデルを作成する場合は、associationを使います。 ただ、必ずしも毎回そのモデルが必要になるのか?と言われると疑問が浮かびます。 なので、選択制にする方が自由度が高いと考えています。 taritは選択制にできるので、使い方を書きます。 trait f…

routeのresourcesのnestした部分をnamespaceにする方法

nestしたresourcesだと、namespaceでcontrollerとviewのファイル置き場が別々になってしまって嫌です。 下のやつです。 resources :foo do resouces : bar end 結果 foo_bar_index GET /foo/:foo_id/bar(.:format) bar#index POST /foo/:foo_id/bar(.:format…

railsの複数形・単数系がうまくいかない場合の対処

どう見てもこれは変換がおかしいだろってことがありました。 'loves'.singularize => "lofe" 普通にloveを返すべきところじゃん・・・ このおかげでpathがnew_lofe_pathなんてなったりしました。 これはどうにかしたいと思ったら、イレギュラー登録をするこ…

コールバックの処理が増えてきたら、メソッド化する

コールバックの処理が増えてきて、可読性が悪くなる場合はまとまりをメソッド化にしましょう。 例えば、下記のようなものがあったとします。 before_save : hoge, :foo, :bar, .... if: :test これがどんどん膨らんでいくことは、想像できます。 なので、hog…

加工したデータのf.selectの作成方法

f.collection_selectを使いたいけど、なんか違う・・・ 少し加工したデータをセレクトで表示したいという時の方法です。 状況 選手名(Playerモデル)のデータを表示しようとしています。 first_name, last_nameとカラムが分かれている full_nameというメソッ…

特定のcontroller配下で指定のレイアウトを使用する方法

railsでadmin配下のレイアウトはapplication.html.slimとは別のものを使用したいため、テンプレートを分けたいということがありました。 やり方 対象のcontrollerのviewをlayouts以下に作成する 特定のcontrollerの配下で使用するため、layoutsを指定するよ…

disable_withで二重送信を防げ!

よくある連打されてエラーになるパターンですね。 = f.submit "送信", class: "is-button-black center__block", data: { disable_with: t("sending") } こんな感じでdisable_withをつけることで、ボタンクリック後に指定した文字に切り替わってくれます。 …

モデルのカラムが真偽値なら、?で答えを確認できるということ

便利なんですけど、パッと出ないので、忘れないために書いておきます。 notify_email: booleanこんな状況とします。 x = User.first x.notify_email? => true こういうことができます。 以上。

tryを2回使うなら、mapで繋げてみる

最近はコードを短くことにはまってます。 リファクタリング好きな人の気持ちがわかりました。 今回はtryを2回使うパターンですね。 そんなのあるか?って思いますが、ありました! 特定の子モデルのテキスト内容の長さを比較する場合などです。 user.blogs.b…

find_and_updateの書き方

最近リファクタリングにはまってます。 一行でもコードがなくなるのが楽しいです。 今回はfind & updateの方法です。 user = User.find(params[:id]) user.update(user_params) これが一般的な書き方ではないでしょうか。 一行で書く方法は二つあります。 Us…

配列指定のリファクタリング

片方が文字列で、展開式は配列をしている場合です。 同じ処理なのに、文字列を配列で処理が違うなんて・・・みたいな展開があった場合です。 文字列の処理を配列にすれば大丈夫です。 def hoge(hoge)←文字列 or 配列が入ってくる Array(hoge).each do |x| ..…

railsで特定のjsを読み込ませるようにする設定

全部は入らないから、このページだけjsを読めるようにしたい!って思うことは多いはずです。 ちなみに、自分はturbolinksを捨ててます。 イベントが発火しないとか、しんどいので・・・ 準備 まずは、application.jsから全体を読み込むような設定をなくしま…

collection_selectにclassをつける方法

よく、promptの部分を記述しろ!みたいなこと書かれていますが、selectedの場合が書いていなかったので、書いておきます。 そもそものソースコードを見てみます。 def collection_select(object, method, collection, value_method, text_method, options = …

mysqlのexplainを使って、パフォーマンスを改善してみる

sqlのパフォーマンスで実験していたので、試した結果を載せます。 前提条件 Speakerモデルというのがあります。 テーブルの状態は下記のようになります。 show columns from speakers; +------------+--------------+------+-----+---------+---------------…

2つのカラムをくっつけて、likeで検索する方法

first_name, last_nameを二つのカラムがあるとします。 これを合わせて、両方をくっつけた場合の検索をしたい時です。 select first_name, last_name from users where type = "#{type}" AND CONCAT(first_name, last_name) like ? CONCATを使用して、カラム…

railsのajaxのやり方

ajaxのやり方は色々あると思うのですが、その中の一つの書き方です。 サンプルとして、commentの中の現在時刻を更新する方法をajaxで書きます。 こんなpartialがあったとします view側 comments/index.html - year = Time.now.year - month = Time.now.month…

本番環境で画像が表示されなくて困ったので、なんとかした

本番環境で画像が表示されない・・・ assetsは読み込まれているけど、画像のみ表示されない。 状況はhttp://hoge.com/public/images/sample.jpgで画像は表示されるけど、実際のpathは= image_tag /images/sample.jpgで書いており、publicが邪魔で表示されな…

railsのproductionの真っ白画面対策

無事にサーバーの設定も終わっているのに、画面が真っ白。 状況がわからないので、logにあるunicornのerror_logを確認します。 E, [2016-07-10T11:03:58.328188 #17037] ERROR -- : app error: Missing `secret_token` and `secret_key_base` for 'productio…

capistranoの設定方法

案の定苦戦したので、設定ファイルのサンプルと対処法を載せます。 概要 deployツールで使用されています。 gitでversion管理されたものをreleases管理しているので、rollbackして戻すことができたりします。 deploy失敗した→git revertするより、まずはroll…

railsのcacheを使ってみる

本番サーバーではガンガン使われているのですが、私自身がcacheを知らないので、調べました。 cacheとは 元となるデーターベースが更新されていないのに、ページ自体をリクエストが飛ぶ度に動的に作成するのは無駄になってます。 一度読み込んだページは、再…

unicornについて

unicornについてわかってなかったので、調べました。 ついでに設定ファイルを書いておきました。 間違っていたら教えてくださいm( )m unicornとは Rack webサーバーの一種です。 Rack webサーバーが何をしているかという、下記の問題を解決してくれています…

form errorで作成されるcssクラスを変更する方法

railsで自動で生成されるform errorの属性を変更したい人っている気がします。 config/application.rbで変更できるのですが、一部分だけ適用したい!って場合があると思います。 一部分だけ適用する方法です。 基本的なやり方 まずは基本的なやり方です。 co…

railsで条件つきvalidationをする方法

A, B, Cがあり、Aをしたら、B,Cがvalidationを行うという状況をしたかったです。 こんなことってありませんか? あまりないのかもしれない・・・ やり方 with_optionsを使えば特定の条件下で複数のvalidationをかけることができます。 個別で行いたい場合は…

railsのpresenceが便利という話

presenceという便利メソッドがあることを教えてもらったので、メモがてらに書いておきます。 使い方 まず、sourceコードです。 presence (Object) - APIdock def presence self if present? end present?であれば、selfを返すというシンプルメソッドですね。…

content_forで特定のページのみ使う処理をする

特定のページでjsだけ読ませたいというのは、よくあることだと思います。 そんな時のためのcontent_forというものがあります。 content_for - リファレンス - - Railsドキュメント 使い方 読み込みをさせる場所にyieldを使います。 app/views/layouts/applic…

モデルの双方向の関連付けをinverse_ofで整合性を保つようにする

モデルの関連付けをしているので、同じことを意味するのにobject_idが違うためにfalseになるパターンです。 モデル例 class User < ActiveRecord::Base has_many: comments end class Comment < ActiveRecord::Base belongs_to: user end こんな関連付けをし…

paper clipでurlから画像を取得する

よくある(?)urlを入力して、画像を入れるシステムです。 どうやればできるんだ?とか思っていましたが、paper clipで標準でありました。 使い方 参考 github.com 公式にすでにやり方が書いてあります。 class User < ActiveRecord::Base attr_reader :ava…

in?とinclude?について

in?という、ActiveSupportのメソッドが使いやすいかもしれないと思ったので、書いておきます。 自分が今やっているプロジェクトで使われていたので、調べました。 結果は同じのinclude?と比較します。 include? まずは、include?からです。 x = [1, 2, 3] y …

railsのhidden_fieldで渡す値をsessionで渡してみた

これ以外のいい方法があれば、教えてください>_< 状況 画像のurlを送信 画像のurlが正しいか確認したい 画像表示をして確認したいので、一時的にでも保存したくない(確認画面に移行) 画像確認後、画像に対して引用先を入力させる 画像のurlを送信→validation…

has_oneに対して、accepts_nested_attributes_forを使用する方法

has_manyに対してはよくあるのに、has_oneだとないんですよね。 しかも微妙にやり方が違うっぽい(?) 実はhas_manyと同じようなやり方でできることを知っている方がいたら教えてください>_< accepts_nested_attributes_forとは 関連するモデルに対しても、…

ランダムなデータを1件取得する方法

データを一つだけ抽出したいランダム機能的なやつです。 random_number = モデル.pluck(:id).sample←これでランダムな値を取得する モデル.find(random_number) 以上です。 これが一番早いはずです。 モデル.all.sampleでやってしまうと、すべてのデータを一…

railsのCSSのベンダープレフィックスで悩まなくなるgem

sassを書いてて、変数の使い方にはまって、それを使ってベンダープレフィックスを取り扱う方法をまとめようとしました。 けど、量が多いので、いちいち対応するのは個人では無理だって気づきました。 しかも、不要になったら書かなくていいとか、そんなのを…

railsのsessionの値の保存先

railsのsessionの値は暗号化されているということなので、どこに保存されているのか気になっておりました。 なぜなら、これがバレてしまえば、アカウントハックの可能性が生まれるからです。 sessionについて railsのsessionはcookieを暗号化して保存してい…

rspecのletの注意事項

rspecでletを使うとインスタンス変数を使わずにアクセスできるので便利です。 ただし、注意事項があります。 それは、遅延評価されるということです。 describe 'DELETE #destroy' do let(:contact) do create(:contact, firstname: 'Lawrence', lastname: '…

nullを理解していなかった話

内容が間違えていたので、修正しました nullを理解しておらず、はまりました。 null 未定義であるということ 数字の0や空白とは違う はまったこと migrationのnot null制約は生成時のvalidationになります。 migrationのnot null制約は値がnullかどうかの判…