rails

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かどうかの判…

railsでSTIの使い方

自分のサイトを作ろうとしていて、STI(Single Table Inheritance: 単一継承テーブル)を使ってみました。 STIは一つのテーブルを継承したクラスを作成することができます。 modelにtype(string)を入れる modelから継承したクラスを作成する。 簡単な図で表す…

railsのnewとbuildの違い

結論からいうと、ありません。 user = User.first user.comments.new => #<Comment id: nil, body: nil, user_id: 1, created_at: nil, updated_at: nil> irb(main):005:0> user.comments.build => #<Comment id: nil, body: nil, user_id: 1, created_at: nil, updated_at: nil> 昔は、newだと上のuser_idが入らなかったみたいですね。 今はどちらも入るようになっています。 そのた…</comment></comment>

railsでモデル内にvalidationを書く

前回の記事では、共通化したvalidationの書き方でした。 mikamisan.hatenablog.com 今回は、単一のモデルでしか使わないvalidationの書き方になります。 書き方 class User < ActiveRecord::Base validate :email_validate def email_validate valid_address…

railsで独自のカスタムvalidationを作る

validationって意外に簡単に作ることができます。 controllerに書いていた、正規表現の入力チェックなどは、validationにしましょう。 こういうのをcontrollerに書くことで、controllerがどんどん重くなっていきます。 モデルの役割は検証もあるので、バンバ…

railsのsqlインジェクションの対策方法

sqlインジェクションという、昔ながらの攻撃技があります。 内容 アプリケーションが入力値を適切にエスケープしないままSQL中に展開することで発生する。 次のようなSQLを発行することを考える。 SELECT * FROM users WHERE name = '(入力値)'; ここで入…

railsのflashを改行して表示をする方法

flashを改行して表示させる方法です。 app/controllers/hoge def create ...何かの処理を書いている falsh[:notice] = 'hogehogehogehogehoge<br> ←<br>が混ざっている hogehogehogehogehoge' ... end ここでview側でhtml_safeをつけます。 app/views/hoge.html.slim…

modelの共通のvalidationをまとめる便利なconcerns

railsのDRYの原則に基づくのなら、modelのvalidationに共通ができてしまったら、共通化したいですね。 そんな時に便利なのがconcernsです。 app/models/concerns こんなフォルダがあると思います。 ここに記述していきます 使い方 例えば、PostモデルとComme…

railsのurlをroot_url+手書きで書いてたりするの?

はい、書いてました。 手書きの何が悪いんだ! って思うんですが、テストや変更に圧倒的に弱いんですよね。 これが致命的ですね。 基本的に手書きで書くのはやめましょう。 手書きで書くというのは、こういうのですね。 url = root_url + 'contact' こういう…

railsでもtransaction機能を使おう

railsからプログラミングをやりだした自分は、どうしてもsqlの機能についておろそかになってしまいます。 sqlの処理はデータベースの処理なので、大切なユーザーのデータです。 すいません、削除しちゃいました(テヘ では、問題がすみません。 そんな大事な…

関連するモデルの最大値・最小値の求め方

railsで関連するモデルの最大値・最小値の出し方です。 まったく知らなかったので、備忘録で書いておきます。 UserモデルがCommentモデルをもっているとします。 class User < ActiveRecord::Base has_many :comments end maximum user = User.first user.co…

klassの使い方

klassって意味がわかんないよーって状態だったので、調べました。 下記を参考にさせていただきました。 stackoverflow.com 定義 classは予約語なので、classが使えないときに使いましょうということでした。 サンプル def inspect_class(class) puts class.c…

update_attributes/update_columnsの違い

今日はupdate_attributes/update_columnsの違いについて説明します。 自分自身が違いを理解していなかったので、使い分けの理解ができていなかったです。 概要 下記の記事から引用させていただきます。 qiita.com メソッド 保存 バリデーション(*1) コールバ…

railsのroutesの確認方法のまとめ

routesの確認方法をまとめます。 コマンドラインでbundle exec rake routes bundle exec rails serverの適当なURLを叩いて、error画面で確認する http://localhost:3000/rails/info/routesにアクセスする この3種類かと思います。 他にあれば、指摘をお願い…

ActiveRecordのwhereの書き方

whereって気にもせずに書いていたので、色んな書き方があると知りました。 備忘録として書いておきます。 一致しているものがあるかどうか Post.where(body: 'hoge', id: 1) Post.where('body = ? and id = ?', 'hoge', 1) ○○以上、以下 Post.where('id >= ?…

railsで毎回データベースに問い合わせる判定処理を書いてしまったとき、データベースにpluckで一覧データを作成しよう

1つのSQLの発行をなくすと、5ms早くなります(自分の運営サイト) それが一覧ページだと20回以上発行されていて、無駄に重くなっていたのですが、解決しました。 毎回1SQLが発行されると処理が重くなるのは、前回の記事を見て頂いたら、わかるかと思います。…

railsの親モデルから子モデルへのcountをするのは、counter_cacheを使ってみよう

サイトのパフォーマンスをチェックしていたら、おぞましいSQLの発行が行われており、サイトが重くなっていました。 これは気持ち悪いですね。 こんな大量にSQLが発行されていたら、表示速度が無駄に遅くなります。 では、話を今回のモデルの概要です。 Post …

railsのモデルにorderの処理を記述する

コントローラーにorder(created_at: :desc)が多くなると、すごく可読性が悪くなるなって感じました。 よく、こういう感じなことが起こると思います。 @user = current_user @posts = @user.posts.order(created_at: :desc).page(params[:page]) ここからさら…

jsファイルもi18n対応しよう

i18nにはまりました。 ソースコードに日本語がなくなること 同じ項目内容が一括変換できるようになる 変数対応もできる slimを使っているとよく|を乱用していたので、うまく使うことで乱用しなくても済みます。 さて、今回はjsファイルもi18nにすると、jsの…

i18nでcontrollerのactionと連携させる方法

railsでi18nでメッセージを追加しようと思っていましたが、やり方がわからずに途方に暮れていました。 user_session controllerという場所にcreate methodを作成して、失敗した時にerrorメッセージを出したい場合です。 config/locales/ja.yml ja: user_sess…

railsでclassにactiveを付けるhelperの作成方法

jsを使っていたりする場合、よくここにいるという、表示でclassactiveをつけたりします。 その判別方法をhelperで作成します。 app/helpers/application_helper.rb def active?(controller_name, controller_action) if controller_name == params[:controll…

rails g controllerでディレクトリの階層以下にファイルを作成する方法

userというディレクトリファイル以下にcontrollerを作成する方法 rails g controller user::hoges →create app/controllers/user/hoges_controller.rb どうやってやっているのかわからなかったけど、思ったより簡単に作成できます。

capybaraでbutton・form以外の要素をクリックさせる方法

ボタンは使わないけど、クリックさせて何かのアクションを起こさせるときに使う方法です。 よく、click_on click_buttonを使うと思うのですが、それ以外の場合ですね。 find('#hoge').click このfindで要素を探させて、その要素をクリックさせることができま…

capyabaraで要素が重なった時に、最初のものをクリックする方法

capybaraを使っていると、ボタンをクリックするのに要素が重なったりする時があります。 例えば、こんな感じのエラーですね。 Failure/Error: click_on 'コメント' Capybara::Ambiguous: Ambiguous match, found 3 elements matching link or button "コメン…

has_many :throughの使い方

よく言われるのは、多対多の関係で使うと言うものです。 ということで、多対多のモデル関係で試してみます。 例えば、「ユーザー(User)」が「ブログ(Blog)」を投稿し、ブログの「コメント(Comment)」をつけ、ユーザーに関連する「コメント」を取得する場合で…

Factorygirlのモデルの関連付けのやり方

Factorygirlで関連付けしたモデルのテストを行いたい時があります。 そこで、Factorygirlのモデルで関連付けする方法になります。 Userモデルに対して、Postモデルが属するという関係です。 Userモデル class User < ActiveRecord::Base has_many posts end …

rails のrenderにローカル引数を渡す時の注意

renderを使っていて、ローカル引数が渡せなかったので、忘れないために書いておきます。 _form.html.slim = form_for(user) do |f| = f.text_field :name = f.submit new.html.slim render 'form', locals: { user: @user } →undefined local variable or me…

railsの「設定より規約」の意味

railsはよく「設定より規約」(CoC: convention over configuration)と言われます。 この意味が全然わかっていなかったのですが、今日実感しました。 Layouts and Rendering in Rails — Ruby on Rails Guides こちらにも書いてあるのですが、下記のようなコー…

railsのテンプレートエンジンの設定をしよう

新しいcontrollerを作成する時に、rails g controller hoge index〜をする度にerbやらscssが作成されます。 何回か新しいアプリの作成をしている時に毎回設定を探していたのですが、そもそもの原理が分かれば、自分でできるので、自分への備忘録も兼ねて書い…