youRubyのWebエンジニアやってます。Railsのことで勉強になったこと書いていきます。この広告は、90日以上更新していないブログに表示しています。db:seedでデータをDBに挿入してくれます。毎回、seeds.rbを書き換えないといけません。1回だけならまだいいですが、間隔をおいて何回も挿入しなければいけないときは、だいぶめんどくさいです。SEED_FILENAME='seeds/ファイル名'railsコマンドの引数でファイル名を渡して、seedデータを挿入する方法を書いていきます。ディレクトリの構成はこんな感じです。03_sample_seeds.rb挿入したいテストデータをdb/seeds配下のファイルに記載している想定です。ファイル名でタスクファイルを作成することができます。dbとコマンドを叩き、lib/tasks/db.rakeを作成しました。どのseedファイルを実行するか記載タスクファイルが作成できたら、中身を書いていきます。SEED_FILENAME='seeds/03_sample_seeds.rb'に合わせて書いていきます。今回はこのような感じで書いてみました。endend以下から各メソッドの解説です。・namespaceapiのルーティングなどでよく使われるnamespaceメソッドですが、ここではコマンドを叩くときのコマンド名みたいなものです。これをネストしていくとコマンドもネストされます。いう風なコマンドになります。・descメソッドの説明文になります。-Tでタスクを表示したときに一緒に説明文が表示されます。・task実行するメソッド名です。成功していないマイグレーションがあるとデータを入れるのはよくないので、先に'db:abort_if_pending_migrations'を実行するようにしています。・File.joinseedファイルまでのパスを生成するメソッドです。コマンドの引数であるSEED_FILENAMEからファイル名を受け取り、実行するファイルを特定します。'db'と記載しておくことで、コマンドからの引数であるファイルまでのパスを省略できます。load(seed_file)で実行しています。月毎に合計値や前月などを計算しています。今回のようなテストデータを入れられるタスクを作りました。改善点あれば是非ご指摘ください。07:36railsコマンドでファイル名を指定してseedデータを入れる方法Tweet広告を非表示にするもっと読むコメントを書く2018-09-01【Ruby】もっと早く知っていればよかったmapメソッドmapメソッドmapメソッドとは、配列やハッシュに対して使えるメソッドで、要素の数だけ繰り返しブロックを実行し、ブロックの戻り値を集めた配列を作成して返します。↑と、Rubyリファレンスには書かれております。このメソッドを知った時は、このメソッドを知らないのは罪だと思いましたwwwなぜなら、このメソッドを知らない自分はこんなことをやったらからです。mapメソッドを知らないとき半年ほど前から、カップル専用の家計簿アプリを作っているのですが、家計簿には当然カテゴリ分けがあります。実装していく中で、特定の条件のカテゴリのidを集めたいと思いました。何回も使わなければいけないと思ったので、モデルにscopeを追加しました。{unscope(:order).select(:category_id).distinct.pluck(:category_id)}すでにこのスコープを作るのにも一苦労しました。orderが既にかかったものにselectなどがかけられなかったのです。次に、このメソッドを呼び出すときです。partner_expenses.extract_category)このように、scopeを使ったとしても、何回もそのscopeを呼び出していました。mapメソッドを知った後それがmapメソッドを使うとこんなにも簡単に書けます。i.category_id}scopeなどは必要なかったんです。mapを使えばすごく簡単に書けました。エイリアスメソッドとして、collectメソッドもあります。どちらも同じ挙動ですが単語のニュアンスとして、collectのほうが読んでいてしっくり来るときがあります。実は上記の場合は、collectのほうが僕は好きですね。mapメソッドのようなブロックを使った便利メソッドは他にもいくつかあるので、しっかり勉強しようと思いました。Rails】結局メソッドってどこに書けばいいの?Railsではモデルなんて使わなくてもコントローラやビューにメソッドを書きまくっても動かすことができます。そんなことをしてたらMVC構造の意味がないですし、きちんと考えて書くことによって、そのコード量を劇的に減らすことができます。メソッドをどこに定義するかは、そのメソッドをどこで呼び出したいかに依存すると思います。今回はビューで呼び出したいメソッドを定義する場所について書いていきます。同じビューを2つのコントローラで使っていました。何も考えていなかった頃は、コントローラで計算してインスタンス変数に代入してビューで使うということをしていました。current_user.badgetsendこの二つのコントローラは全く同じ、ビューにレンダリングされます。これは後々のことを考えると、何か修正したりするときにかなり手間がかかります。ビューはインスタンス変数に依存するんです。ビューのインスタンス変数の数だけコントローラで定義しなければいけないんです。コントローラは薄くというのは鉄板らしいですね。コントローラを薄くするにはこれまでは単純にモデルにクラスメソッドとして計算式を書いて、それをコントローラで呼び出してインスタンス変数に入れてビューに渡していました。ビューではその変数をただ表示するだけでした。これでは修正がかなり大変になります。そこでコントローラでは必要なレコードをまとめて一気にとりだし、必要な計算や表示順はモデルやヘルパーに定義し、ビューから呼び出すようにしました。上のものはこうなります。@cnum).both_tendたったこれだけになります。前者ではインスタンス変数をわけていたものを、後者ではまとめています。必要な計算やクエリなどはモデルとヘルパーに書いていきます。モデルか?ヘルパーか?ビューにはできるだけロジックを書かないというのが鉄板です。viewの役割であるブラウザで何を表示するかというのがわかりにくくなりますもんね。そこでビューに関するロジックは大体はモデルかヘルパーに書いていきます。メソッドを定義するときに重要な点は、selfメソッドが使えるかどうかです。このselfというのは定義するところによって、インスタンス自身かクラス自身かが違ってきます。selfが使えなさそうなら、ヘルパーに書きましょう。使えるなら、モデルに定義しましょう。上記の@current_user_expensesと@partner_expensesを例にしてみます。@current_user_expensesは自分が払った全ての出費を呼び出しています。・パートナーのためだけの出費@partner_expensesはuserが違うだけで@current_user_expensesと定義は同じです。この両方を使って自分の支出合計値を計算したいとします。この場合、モデルにこの両方を引数で渡して、呼びだすことができます。@partner_expenses)しかし、ヘルパーに書くとモデル名を省くことができます。@partner_expenses)このメソッドを他のモデルから呼び出したいとなると話は違いますが、ビューでモデル名を書くのは嫌だと言う人もいますし、ただビューで計算したいという場合はヘルパーで十分です。インスタンスメソッドかクラスメソッドかこれはオブジェクト指向に関することです。一つのレコード(インスタンス)に対してのメソッドは、モデルにインスタンスメソッドとして書きましょう。出費テーブル、カテゴリテーブル、そのカテゴリに対する予算テーブルがあるとします。expense.category.badget.amountと言う風にも呼び出せますが、何回も書くと長いですよね。これをインスタンスメソッドとして定義します。expense.category_badgetこうすることですっきりしますね。複数のレコードに対してはクラスメソッドで定義します。ある条件で表示する順番を入れ替えたいとします。(並び替えの処理)endとすると、すっきりします。これをヘルパーに書いてしまうと@current_user_expensesとboth_flgを引数で渡さなくはいけません。・ビューで呼び出したいメソッドを定義するときは、selfメソッドが使えるかどうかでモデルとヘルパーのどちらに書くか判断する。これでReactに必要なフォルダやファイルが生成されてReactが入る。webpackerによりapp/javascript/packsにhello_react.jsxが生成されているのがわかる。React」を表示させる簡単なものである。webpackerにより使えるようになったを追加していく。React」が表示される。react-railsのReactコンポーネントの作成react-railsではReactコンポーネントは以下のコマンドで作成できる。配下にコンポーネント名.jsが生成される。app/javascript/component/calculator.jsが生成される。helperを記載しておくと、app/javascript/component/calculator.jsを読み込んでくれる。%>を記載しておけば読み込んでくれる。application.jswebpackerと比べて以下が追加されている。作成したコンポーネントファイルに以下を書かなくてもいい。document.getElementById('root'));webpackerのみ場合react-railsがないとrailsサーバーを起動しても、Reactは動いてくれない。startで同時に行ってくれる。webpackerで読み込むコンポーネントコンポーネントを入れるフォルダを作成webpackerのみの場合、app/javascript/配下にはpacksフォルダしか生成されないので、ここで任意のフォルダを作成する。配下のコンポーネントをimportする。あとはapp/views/layouts/application.html.erbのHEADタグ内にreact-railsの時と同じようにjavascript_pack_tagを追加し、app/javascript/packs/calculator.jsを指定してあげるとviewで読み込んでくれる。06:16Rails5.1にReactを導入Tweet広告を非表示にするもっと読むコメントを書く2018-01-14複数のフォームがあり空のフォームはサブミットされないようにするしたいこと二つのフォームがあり片方は何も書かれていない空の状態であれば、そのフォームをサブミットせずに記入されている片方のフォームだけ送信する方法。この記事のように二つのフォームが同じモデルへ送信するのであれば、これは意味がないが、それぞれが別のモデルへ保存される時に便利。今回はこの一つのフォームで複数のモデルへ保存するフォームに実装することを想定して作例する。そこまで深入りしないが、今回はお互いのフォームはアソシエーションで紐づいていて、親子関係にあるため、親モデルのフォームが空であっても、親モデルのレコードは作成されるようにしている。ポイントサブミットするときの関数を設定する。PATHを頼りにgemがインストールされているところへ行き、app/assets/javascripts/へautosize.jsファイルをコピーしたjqueryコードautosize($('textarea'));たったこれだけで、縦幅が自動で変更されます。一度送信ボタンへ押すだけでreviewはもちろん、そのreviewに紐づいたphraseも保存する。reviewモデルとそのreviewモデルに紐づいたphraseモデルが存在している。%>学んだことfield_forメソッドで異なるモデルへ保存するためのフォームを作成できる。controller#newでtimesメソッドを使ってインタンスを作成しておけば、viewではeach文を使って保存しなくても、(field_forだけではなく)form.fields_forでコントローラーで作成したインスタンス分のフォームを表示してくれる。[:content])を読み取り、それぞれのモデルのレコードを更新できる。trueをつけておくとそれを無効化しておく。今回はあってもなくても、どちらでも大丈夫。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。