20210418のRailsに関する記事は21件です。

条件分岐と演算子について

フリマアプリの商品詳細画面で 条件分岐1 ログインかつ出品者 こちらには編集雨ボタンと削除ボタン表示 <% if user_signed_in? && current_user.id == @item.user_id %> devise導入で使用できるメソッド メソッド 用途 user_signed_in? ユーザーがサインイン済かどうかを判定 current_user サインインしているユーザー情報を取得 @item.user_id 今ログインしている人のuser_idがitemテーブルにあれば出品者ということになる。 *before_action :authenticate_user! コントローラーに設定して、ログイン済ユーザーのみにアクセスを許可する 条件分岐2 ログインはしているが出品者ではない投稿者 購入ボタン表示 <% elsif user_signed_in? && current_user.id != @item.user_id %>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

¥エンマークをつけて3桁区切りで表す

①変数で価格の数値を取得 変数 表示 =@item.price 9768 メソッド 表示 number_to_currency(数値 [, オプション]) = number_to_currency(@item.price) 9,768.00 *コンマがつくが、小数点まで表示される ②小数点以下を消す メソッド 表示 number_to_currency(数値 [, strip_insignificant_zeros: true]) = number_to_currency(@item.price, strip_insignificant_zeros: true) 9,768 ③通貨マークを表示させる メソッド 表示 number_to_currency(数値 [, strip_insignificant_zeros: true]) = number_to_currency(@item.price, unit: "¥", strip_insignificant_zeros: true) ¥9,768 参考:@Sotq_17さん 感謝です。 https://qiita.com/Sotq_17/items/1e45ff848d8ebab221e5
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[即席]Railsの複数画像投稿に枚数制限をつけたい!

はじめに 本日、ポートフォリオ作成中に、「あ、複数画像投稿の枚数の制限をかけたいな〜」と思い調べたのですが、あまり「これだ!」と思える記事に出会えなかったので、私なりに簡単に楽に実装できる方法を考えてみたのでここでアウトプットします。もしかしすると、かなり脆弱性のある実装かもしれませんが、そこは個々のご判断でお願いいたします。 結論 結論からいうと、添付したファイル数が基準を超えたときに、アラートを出して投稿(更新)ボタンを非活性化してしまうということです。 以下に具体的なコードを貼っておきます. 実言うと、これはプレビュー機能実装で使ったコードなんですけどね、、、 preview.js document.addEventListener('DOMContentLoaded', function(){ const ImageList = document.getElementById('practice-views'); const submit=document.getElementById("submit"); //更新ボタンの取得 //ファイル選択をしたときに以下を発火 document.getElementById('practice_image').addEventListener('change', (e)=>{  while(ImageList.lastChild){ ImageList.removeChild(ImageList.lastChild);//ここは気にしなくてOKです } }); document.getElementById('practice_image').addEventListener('change', (e)=>{ const files = e.target.files;   //以下で枚数制限をかけています。 if(files.length>4){ alert("投稿できる画像数は4枚までです"); submit.setAttribute("disabled",true); //非活性にする!!!! return false; }else{ submit.setAttribute("disabled",false);//活性にする!!!! } Array.from(files).forEach(file => { const blob = window.URL.createObjectURL(file); const imageElement = document.createElement('div'); imageElement.setAttribute('class','preview_image' ); // 表示する画像を生成 const blobImage = document.createElement('img'); blobImage.setAttribute('src', blob); imageElement.appendChild(blobImage); ImageList.appendChild(imageElement); }); }); }); とりあえず、結論だ見たい方はここに着目してください。 preview.js document.getElementById('practice_image').addEventListener('change', (e)=>{ const files = e.target.files;   //以下で枚数制限をかけています。 if(files.length>4){ alert("投稿できる画像数は4枚までです"); submit.setAttribute("disabled",true); //非活性にする!!!! return false; }else{ submit.setAttribute("disabled",false);//活性にする!!!! } イベントオブジェクトの中から、添付したファイルの情報をとってきてfilesに格納しています。そして、そのfiles.lengthで格納されているデータの数を見ているわけです。たったこれだけです。!!! ちなみにeturn false;にしているのは、画像枚数が制限つを超えた場合は後の処理をさせたくないからです。 おわりに 以上で、画像枚数の制限をかけることができました。 手軽に簡単に実装したい方は、この方法を是非検討してみてくださいね!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

$rails newする時のオプション

Railsはコマンドを数回叩くだけで簡単にアプリを立ち上げられるフレームワークだが、rails newする時のオプションには注意した方がいいらしい。 -hでオプション一覧が見られるよ rails newのオプションを一覧で見たいときは、rails new -hでヘルプ表示すれば一覧を見ることができる。 Rspecなどminitest以外のテストFWを導入する場合 railsはデフォルトminitestというテストを使用しているが、Rspecなどを使用する場合は以下オプションをつける --skip-test もしくは-T teminal. rails new appname -T rails new appname --skip-test フロントをJSでSPAで作成したい場合 --skip-turborinks ↓後からでも消せるけど。 Rails6においてデフォルトで組み込まれているturbolinksを削除する方法 DBを変更したい場合 -d データベース名 terminal. rails new appname -d mysql rails new appname -d postgress
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Railsのリファクタリングの例

リファクタリングとはプログラミングにおいて、プログラムの動作を変えずにコードの内部構造を整理すること、つまりコードを見やすくすることを言う。 修正前 <% if user_signed_in? && current_user.id == @item.user_id && @item.purchase.blank? %> <%= link_to "商品の編集", edit_item_path, method: :get, class: "item-red-btn" %> <p class="or-text">or</p> <%= link_to "削除", item_path, method: :delete, class:"item-destroy" %> <% else user_signed_in? %> <% if @item.purchase.blank? %> <%= link_to "購入画面に進む", item_orders_path(@item) ,class:"item-red-btn"%> これはフリマアプリの一例で、ユーザーのログイン状態において出品した商品の編集、削除ボタンが表示されるか、もしくは購入ボタンが表示されるかの条件分岐を記述したものである。 これだと1行目に「ログインしていればかつ現在ログイン中のユーザー、出現在ログインしているユーザーが商品の出品者であればかつ商品は売れていなければが同じである」というややこしい表記法になっている。 さらに5行目にまたuser_signed_in?があり、6行目に商品は売れていなければの記述で購入画面に進むを表示させる制御をしている。 そこで下記のようにリファクタリングしてみる。 <% if user_signed_in? || @item.purchase.blank? %> <% if current_user.id == @item.user_id %> <%= link_to "商品の編集", edit_item_path, method: :get, class: "item-red-btn" %> <p class="or-text">or</p> <%= link_to "削除", item_path, method: :delete, class:"item-destroy" %> <% else %> <%= link_to "購入画面に進む", item_orders_path(@item) ,class:"item-red-btn"%> <% end %> <% end %> 1行目に大きな条件として"ログインしていれば" かつ "商品は売れていなければ"を記述、2行目に"現在ログインしているユーザーが商品の出品者であれば"をif文のネスト構造で記述して「商品の編集」「削除」を表示させるか 「購入画面に進む」を表示させるかを制御している。 1行にまとめるよりも2行に分けたほうが後々わかりやすく重複しない。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

pgエラー

cloud9上でbundle updateの時pgのエラーがでました エラー内容は An error occurred while installing pg (1.1.4), and Bundler cannot continue. Make sure that gem install pg -v '1.1.4' --source 'https://rubygems.org/' succeeds before bundling. 色々調べたら brew install postgresql が良いと しかし結果は Command 'brew' not found, but can be installed with: sudo apt install linuxbrew-wrapper sudo apt install linuxbrew-wrapperを試してもエラー 途方に暮れている中、英語しか書かれていないサイトに手を出す。 その結果 こちら に載っている spring stop gem uninstall pg bundle install --without production で何とかなりました。 よくわかりませんね。。。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Vuetify で特定の id リンクにジャンプする(Stringの場合、v-btnの場合)

経緯 Vuetifyをつかって、Rails で作成した id リンクに直接飛びたい。 しかし、一筋縄にはいきませんでした。 ボタンと文字、それぞれのリンクの付け方が異なっていたからです。 備忘録として残します。 String に idリンク をつけたい場合 <nuxt-link :to="{ path: `/users/${item.user_id}` }"> <span> Something </span> </nuxt-link> v-btn に idリンク をつけたい場合 <v-btn nuxt :to="`/users/${item.user_id}`" > Something </v-btn> 参考記事 Nuxt × Vuetifyの状況下でv-btnをnuxt-linkにして使いたい モーダルへのNuxtオープンリンク https://knews.vip/q/so73690053/mo-daru-e-no-nuxt-o-pun-rinku 以上です。{} や / や " など、どの記号が必要なのか総当たりで試しました。 この記事で、どなたかの時間が節約されるのであれば幸いです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】RSpecによるActiveStoregeでアップロードした画像のテスト

はじめに  RSpecでモデルテストを書いている時にActiveStorageでモデルに関連づけた画像のバリデーションのところでつまづいたのでメモ。  RSpecとFactoryBotを使用する。(ここではインストールの部分は省略) やること 音楽レビューアプリのRecordモデルに付けた画像(:jacket)が空の時はエラーを表示する。 モデル RecordモデルはGenreモデルに紐づいている。 Genreモデルは、(一部省略) app/models/genre.rb class Genre < ApplicationRecord has_many :records end Recordモデルは、(一部省略) app/models/record.rb class Record < ApplicationRecord belongs_to :genre has_one_attached :jacket #一つの画像 validate :jacket_presence #画像のバリデーション def jacket_presence unless jacket.attached? errors.add(:jacket, 'must be attached') end end end has_one_attached :jacketで一つの画像を持つとし、 jacket_presenceメソッドで画像が付いていない時はエラーメッセージを追加する。    テスト用画像の用意  まずpublicディレクトリにjacketsファイルを追加し、 そこに一つ画像を追加する。 ここではjustin.jpgファイルをpublic/jacketsに追加。    FactoryBotを編集 まずはGenreを編集する。 spec/factories/genre.rb FactoryBot.define do factory :genre do name { "Pop" } end end 次はRecordを編集する。 spec/factories/record.rb FactoryBot.define do factory :record do name { "Justice" } release_year { 2021 } artist { "Justin Bieber" } #genreとのアソシエーションは、 #genre_id { 1 } でなく、以下のように書く genre #recordモデル作成後:jacketを関連づける。 after(:build) do |record| record.jacket.attach(io: File.open('public/jackets/justin.jpg'), filename: 'justin.jpg') end end end これでテスト用のモデル作成の準備が完了。    テストファイルの編集 Recordのモデルテストを編集する。 spec/models/record_spec.rb require 'rails_helper' RSpec.describe Record, type: :model do describe 'create new record'do before do #テスト用のRecordを作成 genre = FactoryBot.create(:genre) @record = FactoryBot.create(:record) end   #全ての項目があれば有効。 context 'with a name, release_year, artist, genre, and jacket' do it "is valid" do record = @record expect(record).to be_valid end end #:jacketなしの場合はエラー context 'without a jacket' do it "is invalid" do @record.jacket = nil #:jacketを空にする。 record = @record record.valid? #エラーメッセージが追加される。 expect(record.errors[:jacket]).to include("must be attached") end end end end RecordはGenreに紐づいているため先にgenreを作成している。 これでテストできた。   
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rails初学者によるRailsチュートリアル学習記録③ 第1章

目次 1. はじめに 2. 第1章の概要 3. 学習内容 4. 終わりに 1. はじめに この記事は、Rails初学者の工業大学三年生がRailsチュートリアルの学習記録をつけるための記事です。 筆者自体がRailsやWebについて知識が少ないので、内容の解釈などに間違いがある可能性があります。(その時はコメントで指摘してくださると助かります!) Railsチュートリアル内ではRailsの内容以外にも、gitでのバージョン管理やHerokuを使ったデプロイも学習しますが、gitに関しては既に私が学習済みのため学習記録には記述しません。 演習の記録も省略します。 2. 第1章の概要 AWS Cloud9を使った開発環境の準備 必要なgem, プログラムのインストール 最初のアプリケーションの作成 Railsアプリケーションの仕組みについて コントローラとアクションについて ルーティングについて Herokuへのデプロイ Herokuへのデプロイの準備、デプロイ 開発環境の変更を本番環境に反映させる方法 3. 学習内容 1. AWS Cloud9を使った開発環境の準備 AWSのアカウントの作成~ワークスペースの作成までの説明は省略します。 1-1. 必要なgem, プログラムのインストール ①Rubyドキュメントのインストールをしない設定にする gemのインストール時などにドキュメントをインストールしているとその分時間がかかってしまうので、 コマンドラインで$ echo "gem: --no-document" >> ~/.gemrcを実行して、 ドキュメントをインストールしない設定に変更します。 ②バージョンを指定してRailsをインストールする $ gem install rails -v 6.0.3を実行してRailsをインストールします。 インストールできたかどうかは、$ rails -vを実行してバージョンが表示されるかで確認できます。 ③Yarnをインストールする $ source <(curl -sL https://cdn.learnenough.com/yarn_install)を実行して Yarnというプログラムをインストールします。 YarnはJavaScriptのソフトウェアの依存関係を管理するプログラムで、上記のコマンドは クラウドIDEで開発するときに使用できるCDN経由のダウンロード、セットアップとなります。 ネイティブOSで開発するときはOSごとのインストール方法に従うことになります。 以上で、RailsでWeb開発を行う準備は完了です。 1-2. 最初のアプリケーションの作成 ①Rails newを実行してアプリケーションを作成する どのRailsアプリケーションでもrails newコマンドを実行するところから始まります。 実行すると指定したディレクトリにアプリケーションの原型が作成されます。 Railsチュートリアルでは$ rails _6.0.3_ new hello_appと書くことで、バージョンを指定してhello_appという アプリケーションを作成します。 ②Bundlerを使ったgemのインストール Bundlerとは、gemの互換性を保ちながらgemの導入や管理を行ってくれるライブラリです。 Gemfileに使用したいgemやバージョンを記述してbundle installやbundle updateを実行します。 Railsチュートリアルでは、gem 'gem名', 'バージョン'という表記になっています。 この表記方法だと、指定したバージョンのgemをインストールしてくれます。 バージョン指定の方法は他にもあり、gem 'gem名', '>= バージョン'だと指定したバージョン以上で最新のgemを インストールしてくれます。 gem 'gem名', '~> バージョン'だと指定したメジャーバージョンかつマイナーバージョンかパッチバージョンが 最新のgemをインストールしてくれます。 今回はRailsチュートリアル内のGemfileと同じように書き替えて、bundle installを実行します。 ③rails serverの実行 ここまでで、実際に動かせるアプリケーションが作成されたためrails serverを実行することで、 アプリケーションが正しく動くかを確認することができます。 2. Railsアプリケーションの仕組みについて 2-1. コントローラとアクションについて ①コントローラとは コントローラはWebサーバーへのリクエストを処理します。 チュートリアル内でもう少し先に出てくるモデルと通信して、データベースの情報を受け取ったり、 そのデータをビューに渡して動的なページを作ってもらって受け取ったりします。 ①アクションとは アクションとはコントローラ内で定義されるもので、この段階ではrenderメソッドを使って htmlで文字列を表示させています。 application_controller.rb class ApplicationController < ActionController::Base def hello #applicationコントローラ内のhelloアクション render html: "Hello!" #Hello!という文字列を表示 end end 今後、ビュー内で使用する変数を定義するためにも使います。 2-2. ルーティングについて ルーティングとはブラウザからのリクエストをコントローラに振り分ける役割を持ちます。 今のところは、URLとコントローラを対応付けるという認識です。 ここでは、ルートURLと呼ばれるhttp://www.example.com/ または「/」といったURLへのアクセスを どのコントローラに割り振るかを定義します。 routes.rb Rails.application.routes.draw do root 'application#hello' end 上記のコードではルートURLに対するアクセスをapplicationコントローラ内のhelloアクションに割り振っています。 以上が第1章のアプリケーション作成についての内容です。 3. Heokuへのデプロイ gitへのプッシュ、Herokuのアカウント作成は省略します。 3-1. Herokuへのデプロイの準備、デプロイ ①開発環境と本番環境で使うデータベースの設定 Railsチュートリアルの開発環境ではSQliteというデータベースを使用するのですが、Herokuの本番環境では SQliteが使用できないため、PostgressSQLというデータベースを使用します。 その設定をするためにGemfileに変更を加えます。 Gemfile group :development, :test do #開発環境で使用するgemを指定するグループ gem 'byebug', '11.0.1', platforms: [:mri, :mingw, :x64_mingw] gem 'sqlite3', '1.4.1' #SQlite用のgem end group :production do #本番環境で使用するgemを指定するグループ gem 'pg', '1.1.4' #PostgressSQL用のgem end Gemfileを変更したのでbundle installを実行して準備完了です。 ②Herokuのインストール、デプロイ source <(curl -sL https://cdn.learnenough.com/heroku_install)を実行して、Herokuをインストールします。 その後heroku loginコマンドでHerokuにログインします。 Herokuにログインできたら、heroku createというコマンドを実行して、herokuサーバー上に アプリケーションの実行場所を作成します。 その後、git push heroku masterを実行することで、ローカルリポジトリの内容をHerokuにデプロイすることができます。 3-2. 開発環境の変更を本番環境に反映させる方法 これ以降、開発環境で変更を行い、それを本番環境に反映したいときには、 3-1に沿って、git commit -aでコミットを行いgit pushでリモートリポジトリに変更内容をプッシュした後、 git push heroku masterを実行してローカルリポジトリの内容をHerokuにプッシュします。 4. 終わりに 第1章はまだ躓く個所はなく、かかった時間は約4時間ほどでした。 この記事を書くのにかかった時間が約2.5時間程でちょっと長いと感じたので、次から密度を下げたいなと思っています。 以降の内容も、1章分終わったらQiitaに記事を投稿という流れで進めていきます。 (内容が多い章は記事を2つに分けることも考えています)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

サーバーに保存のないActiveHashデータどう保存させる?

結論:モデルに書いた「Category.rb」というファイルがテーブルの代わりになります。 結論2:カラム名は以下示したものになります(カラムは2列です) app/models/delivery_fee_payment.rb class DeliveryFeePayment < ActiveHash::Base self.data = [ { id: 1, delivery_fee_payment_id: '--' }, { id: 2, delivery_fee_payment_id: '着払い(購入者負担)' }, { id: 3, delivery_fee_payment_id: '送料込み(出品者負担)' } ] include ActiveHash::Associations has_many :items end 1,2,3と数字のある左横のidが1列目カラム名 ’ーー’'着払い(購入者負担)''送料込み(出品者負担)'の左横delivery_fee_payment_idが2列目カラム名 設定方法:「インスタンス変数(もしくはブロック変数など)+ActiveHash設定モデルファイル名」 ①@item.delivery_fee_payment ②item.delivery_fee_payment 以下の情報が取得できます。 >> item.delivery_fee_payment => #<DeliveryFeePayment:0x00007f9d9ab436a8 @attributes={:id=>2, :delivery_fee_payment_id=>"着払い(購入者負担)"}> 結果 設定方法:「インスタンス変数(もしくはブロック変数など)+ActiveHash設定モデルファイル名」+ 「モデルのカラム名」 ①@item.delivery_fee_payment.delivery_fee_payment_id ②item.delivery_fee_payment.delivery_fee_payment_id => #<DeliveryFeePayment:0x00007f9d9ab436a8 @attributes={:delivery_fee_payment_id=>"着払い(購入者負担)" ここで私は取得できなかった問題点がありました モデルのitem.rbのアソシエーションで以下のように組んでいました、 app/models/item.rb belongs_to :category, :status, :prefecture, :delivery_fee_payment, :delivery_prepare app/models/item.rb belongs_to :category belongs_to :status belongs_to :prefecture belongs_to :delivery_fee_payment belongs_to :delivery_prepare つなげることはできないんですね。 ここを直すと通りました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】RailsにおけるYAMLの基本的な書き方について

背景 railsを学習すると拡張子がymlになっているファイルをよく見かけるため、その書き方について調べてみました。 ※内容に間違いなどがある場合はご指摘をよろしくお願いします。 Yamlとは YAML(YAML Ain’t Markup Language)。構造化されたデータのフォーマットの一種で「.yml」で終わるファイル。他にXML、JSONなどがある。各種設定ファイル、ログファイル、データ保存・交換ファイルとして使われている。 Yamlの書き方 ①スカラー&データ型 文字列: '123'、"abc" 数値: 123、0.01 真偽値: true、false、yes、no、on、off Null: null、 ~ 日付: 2021-01-01 タイムスタンプ: 2021-01-01 00:00:00 +09:00 シンボル: :hoge ②配列 行頭に「-」をつける。「-」のあとは半角スペースを入れる。 - apple - banana - orange # ["apple", "banana", "orange"] 半角スペースでインデントを入れると、ネストさせることもできます。 - fruit - #空の「-」を付ける必要がある - apple - banana - orange #["fruit", ["apple", "banana", "orange"]] ③ハッシュ 「キー: 値」で表す。「:」のあとは半角スペースを入れる。 subject: "Email Changed" #{ "subject" => "Email Changed"} ハッシュと配列のネストも可能です。 - name: Tanaka email: hoge@mail.com - name: Suzuki email: fuga@mail.net #[{"name"=>"Tanaka", "email"=>"hoge@mail.com"}, # {"name"=>"Suzuki", "email"=>"fuga@mail.net"}] ④rubyの記述を書く(ERB形式) 「<%= 内容 %>」という形式で表します。 root: <%= Rails.root.join("tmp/storage") %> #{ "root" => "<%= Rails.root.join("tmp/storage") %>"} ⑤アンカーとエイリアス yamlの記述を保存&呼び出しするために使う記述。アンカーは「&」、エイリアスは「*」。 name: &mark fuga email: abc@mail.com user: <<: *mark #{ "name" => "fuga", "email => "abc@mail.com", "user" => "fuga" } 参考サイト・記事 https://magazine.rubyist.net/articles/0009/0009-YAML.html https://qiita.com/tfrcm/items/5f8e4c5795ce41b214d1 https://zenn.dev/shuichi/articles/7d4a171d87a8e4938f35
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

データベースからViewに投稿者名表示させる方法いくつか(データベース検索方法)

PicTweetという以前作ったものを下に記事をまとめます。 環境 投稿したデータでデーターベースには情報が保存されている状態です。 Viewに表示するとは? よくよく考えて見ると データベースの検索結果表示ということ 私の持つ教材からピックアップします。 Tweetモデルに対して「Tweet belongs to User」という形でアソシエーションを定義しているので、Tweetモデルのインスタンスが入った変数.userと記述すると、インスタンスが属しているUserモデルのインスタンスを取得できます。 (例1)アソシエーションなしの場合のコンソールを使用した取得情報 ruby % rails c [1] pry(main)> tweet = Tweet.find(1) [2] pry(main)> User.find(tweet.user_id) => #<User id: 1, email: "test@gmail.com", encrypted_password: "@@@@@@@@@@@@@@@@@", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 1, current_sign_in_at: "2014-12-06 09:00:00", last_sign_in_at: "2014-12-06 09:00:00", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1", created_at: "2014-12-06 09:00:00", updated_at: "2014-12-06 09:00:00", nickname: "test_ruby"> (例2)アソシエーションありの場合のコンソールを使用した取得情報 ruby % rails c [1] pry(main)> tweet = Tweet.find(1) [2] pry(main)> tweet.user => #<User id: 1, email: "test@gmail.com", encrypted_password: "@@@@@@@@@@@@@@@@@", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 1, current_sign_in_at: "2014-12-06 09:00:00", last_sign_in_at: "2014-12-06 09:00:00", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1", created_at: "2014-12-06 09:00:00", updated_at: "2014-12-06 09:00:00", nickname: "test_ruby"> 私はもともとEXCEL VBAの集計を主に担当してたので、このデーターベース検索にはなレなくて データベース検索用のメソッドfindとwhereで検索コードを4つ作りました。 (DRYという観点からはあまり良くないとは思うのですが。) app/controllers/users_controller.rb #①上の教材通りの解答 class UsersController < ApplicationController def show @user = User.find(params[:id]) @prototypes = @user.prototypes end end app/controllers/users_controller.rb #別解②findを使って class UsersController < ApplicationController def show @user = User.find(params[:id]) @prototypes = Prototype.find(user_id) end end 詳細ボタンをクリックしたuser情報からfindを使ってprototypeテーブルを検索 *findメソッドに、idカラムの値を指定すると、その値を持つレコードを取り出すことができます。 参考:railsガイド「1.1 単一のオブジェクトを取り出す」 https://railsguides.jp/active_record_querying.html app/controllers/users_controller.rb #別解③findを使って class UsersController < ApplicationController def show @user = User.find(params[:id]) @prototypes = Prototype.find(params[:id]) end end ②と同じ app/controllers/users_controller.rb #別解④whereを使って class UsersController < ApplicationController def show @user = User.find(params[:id]) @prototypes = Prototype.find(params[:id]) end end whereシンボル指定方法 モデル名.where(カラム名: 条件) app/controllers/users_controller.rb #別解⑤whereを使って class UsersController < ApplicationController def show @user = User.find(params[:id]) @prototypes = Prototype.where(user_id=@user.id) end end where文字列指定方法 モデル名.where("カラム名 = 条件") これなら今の僕の知識でもわかりやすいコードにはなっています。 さらに精進します。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

データベースにデータのあるなしで分岐

先ほど閃きました。 Q:itemsテーブルにデータがあるかないかで分岐させる条件は? A:id番号1のデータがあるかないかを検索すること(これは△) なので Viewには以下のように記述しました。 <% if Item.exists?(1) %> <% else %> <% end %> (参考)メソッドの簡単解説 メソッド名 働き 戻り値の型 exists? 指定した条件のレコードがデータベースに存在するか 真偽値で返す オブジェクト.exists?(条件) 参考:【Rails】exists?メソッドの使い方(基礎~応用編,present?との違い) https://pikawaka.com/rails/exists A:id番号データがあるかないかを検索すること(これは◎) もっと簡単な方法は <% if Item.exists?%> <% else %> <% end %> (1)もかかない ⇨というのも今はデータ1があるこご前提だが、全てデータを行削除して続けると 続きの番号しか取らないので1は永遠に存在しなくなり、データが溜まってもデータなしの状態で表示を続けるため。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

初学者がVue.jsをRailsアプリに組み込めるようになるまでの学習ロードマップ

この記事で得られること はじめに、この記事の目的について。 この記事は一通りRailsアプリケーションを作り終えて、次のステップとして「自分のアプリをモダンなUI/UXを実現したい!」「今っぽいイケてる技術を使ってみたい!」といった動機から、Vue.jsをRailsアプリケーションに組み込みたいと考えている人向けに、学習ロードマップを提供できたら、という狙いです。 以下学習で作成した成果物 私はこれから説明する学習を通して、初学者なりのポートフォリオを作成しました。 ベースはRuby on Rails、ランディングページにVue.jsを使ったアプリです。 StudyReport 最初にたどり着くページはVueのエントリーポイントを作成し、コンポーネントを並べるだけのシンプルな構成です。 またページ内の「Details」から飛べる機能の詳細説明ページは非常に簡単な部分SPAになっています。 こんなレベルでも、Vue.jsを使えるようになりたい!と考えている方には助けになる記事なのではないかと思います。 この記事の対象者 プログラミング初学者 Ruby on Railsは一通り学習し、アプリケーションを作りきった。 JavaScriptは多少触ったことあるかな程度 とにかくVue.jsを入れたい お金はケチりたい 学習ロードアップ 1. まずは公式! やはり最初は公式。 日本語で書かれているのでとてもわかりやすいですし、全ての基礎知識となりますので、やっときましょう。 (自分のアプリ内で応用する時に基礎知識があることが前提となるからです。) 個人的には、「コンポーネントの詳細」の章まで一通りやってみるのかいいかと思います。そのあとは必要に応じてやっていくのが効率が良いかと。 Vue公式 2. ここからはQiita記事 まずはVue.jsのアプリ立ち上げ つくづくQiitaの情報量には感服いたします。 まずはサクッとVue.jsアプリ立ち上げ。 2-1 立ち上げ~vue-router こちらの記事を参考にしていただくと簡単にアプリ立ち上げができます。 またこの記事内ではSPA作成の基本となるvue-routerについて学べます! 2-2 モダンなツールを学ぶ こちらではより見た目をかっこよくできるライブラリなどを学ぶことができます。 vue-typerとかsmooth-scrollとか今っぽくてかっこいいですよね〜 2-3 RailsにVueをいれる方法を学ぶ こちらにはRailsをバックエンドに、Vueをフロントエンドに使ったアプリを作る方法が記載されています。 すでにRailsアプリがあって、追加でVueを入れたい!という場合には「Vue.jsでHello Vue!を表示する」という章から読んでいくのがいいかなと思います。 ここまでで私が作ったレベルのアプリならもうできてしまいますよ! ちなみに私はここまでの学習の副産物としてポートフォリオサイトを作りました。ここでは見やすさの観点からvue-routerは使っていないですが、挙動はそれなりに今っぽい仕上がりになっているのではないかと思います。 3.Railsデータとの連携(筆者積み残し) 本当はRailsのデータと連携して、一つの機能をSPA化できたら尚良しと思っていました。 結論、devise特有のヘルパーなどのVueでの使い方など難しい点が多々あり、今後の積み残しにしていますが、 一度トライはしてみたので、その際に学習した内容をお伝えします。 3-1 いいね機能を作る こちらではRailsをバックエンド、Vueをフロントに使っていいね機能を実装しています。 ここでデータの渡し方などを学ぶことができます。 メモアプリを作る(有料) ここまで公式やQiitaの記事でやってきましたが、だんだん高度になってきたこともあり、情報が複雑化してきました。 そのため私はTechpitの記事を参考に、RailsとVueを使ったメモアプリ作成ハンズオン講座を買いました。 教材はこちら こう言ったベーシックな組み合わせ技術から初めて、高度なSPAを作り込んでいくのが良いのかなと思います。 4.まとめ 正直、あまり高度なことをやれるようになるわけではありません。 しかしVueを使えるようになること、Railsに組み込むことはこの記事の学習ロードマップに沿ってやっていくことで実現できると思います。 ご意見などありましたらコメントいただけると幸いです! 5.出典 Vue.js公式 https://v3.ja.vuejs.org/ (Qiita記事)【超簡単】Vue.jsを使って3時間で自分のホームページを作成&公開する https://qiita.com/abouch/items/35d7a202f3e74c7d4c3e (Qiita記事)Vue.jsでポートフォリオを書く https://qiita.com/shoma3571/items/025a4e8aedeb62b1fed4 (Qiita記事)Ruby on Rails, Vue.js で始めるモダン WEB アプリケーション入門 https://qiita.com/tatsurou313/items/4f18c0d4d231e2fb55f4 (Qiita記事)Rails + Vue.jsでいいね機能を実装する https://qiita.com/TakeshiFukushima/items/a6c698fec648c11eee9a (Techpit)Rails × Vue.js でメモアプリを作成しながらモダンな開発を学ぼう! https://www.techpit.jp/courses/123
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rails | at_beginning_of_month 日付操作 月初, 翌月の月初、先月の月初の取得

月初を取得 #月初を取得 Date.today.at_beginning_of_month #=> Wed, 01 Dec 2010 翌月の月初を取得 #翌月の月初を取得 Date.today.at_beginning_of_month.next_month #=> Sat, 01 Jan 2011 翌々月の月初を取得 Date.today.at_beginning_of_month.next_month.next_month #=> Tue, 01 Feb 2011 先月の月初を取得 #先月の月初を取得 Date.today.at_beginning_of_month.prev_month #=> Mon, 01 Mar 2021 4/1 - 4/15と、先月の同期間(3/1 - 3/15)の比較 @last_month_conversions = Conversion.where(conversion_date: Date.today.Date.today.at_beginning_of_month.prev_month..Date.today.prev_month ) @this_month_conversions = Conversion.where(conversion_date: Date.today.Date.today.at_beginning_of_month..Date.today)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

herokuで動かしている俺のRailsアプリがこんなにメモリを食うわけがない

発端 2021/04/18 ふと気がつくとherokuで運用中のrailsアプリが亡くなっていました。 原因探るの面倒だったので再起動しました。 その後も割と頻繁に死亡していたので、herokuのダッシュボードを確認しました。 すると... ?Memory Usage 100%? なんかメモリが爆上げしているご様子 そして多数のapp crashのログがちらほら 環境 heroku web: Free Dynos worker: Free Dynos Ruby: 2.7.3 Rails: 5.2.5 対応したこと herokuがrubyでのメモリ爆上げ状態の対策をまとめてくださったので、そちらを参考に対応しました。 ありがとうheroku、いいプラットフォームです。 調べてみるとSidekiqで非同期処理を動かしていたのが怪しいみたいな感じでした。 起動時の Worker 数の超過 起動時のWorkerを1にしました。 # config/puma.rb workers Integer(ENV['WEB_CONCURRENCY'] || 2) # CLI $ heroku config:set WEB_CONCURRENCY=1 引用すると 2 つの Puma Worker が原因で、​standard-1x​ dyno が提供できる量を超える RAM が使用されます。これが発生した場合でも、スレッドを使用して、スループットを増大させることができます。または、​dyno サイズをアップグレード​して、実行する Worker の数を増やすことができます。 2つで死が近づくっぽいですね 経過に伴うWorker数の超過 メモリが増加して上限を迎える場合(今回の私の感じで)Puma Worker Killerでプロセスを再起動することでメモリの増加を抑制できます。 gem "puma_worker_killer" PumaWorkerKiller.enable_rolling_restart Worker が再起動すると、数秒間リクエストに応答できないので、繰り返しの再起動がトリガーされると、エンドユーザーは、アプリケーション全体のスループットが低下したときに減速を経験することがあります。再起動すると、スループットは通常に戻ります。 このアプリケーションは非同期処理ではリアルタイム性を特に求めてなかったのでプロセスには容赦なく消えていただきました。 Puma Worker Killerはgemで、指定した条件になったらWorkerプロセスを切るしてくれるイイやつです。 Unicornにも似たようなことができるgemがあったと思います。 環境変数MALLOC_ARENA_MAX=2を指定する https://qiita.com/kazutosato/items/4ab561bf5cc03da75e72 ↑こちらの記事に自分と全く同じ状況の方がいたので参考にさせていただきました。 Herokuでは、上記の2の環境変数MALLOC_ARENA_MAX=2はデフォルトになりました。ただし、2019年9月24日より前に作られたアプリケーションでは自分で設定する必要があります。 らしいです。私のアプリケーションこれより前に作ってた気がしています。 起動時のメモリの超過 こちらは調査で終わったやつですが一応。 derailedというベンチマークのgemで起動時のメモリ使用量をチェックしました。 gem 'derailed', group: :development $ bundle exec derailed bundle:mem これでボトルネックとなりそうなgemを消すという対策です が、Hobby Dynosの512MBを食いつぶすようなものは見つからず... TOP: 67.2734 MiB jemallocでのビルド なんか公式のものよりメモリに優しいアロケータらしい $ heroku buildpacks:add --index 1 https://github.com/gaffneyc/heroku-buildpack-jemalloc.git $ git push heroku master $ heroku config:set JEMALLOC_ENABLED=true 結果 ↑の右の方のダウン(メモリ消費が0になった)の後に対応しました 増え続けていはいない気がするけど、なんか期待してたのと違う とりあえず要経過観察です オチ unicorn起動してたwwwwwwwwwww Procfileでガッツリunicorn起動していました... なんの為に私はpumaの設定をせっせと書き換えていたのだろうか.... unicornのgemもけしました 無事に平和な感じになってそうです
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

画像やタイトルなどいろいろな要素を全て同じリンクをさせる

Controllers app/controllers/item_controller.rb class ItemController < ApplicationController def index @items = Article.all end end app/views/item/index.html.erb <% @items.each do |item| %> <ul> <li> <%= link_to item_path(item), class: 'hoge' do %> <% if item.image? %> <%= image_tag item.image.to_s %> <% else %> <%= image_tag 'no_image.png' %> <% end %> <h4><%= item.title %></h4> <p><%= item.sentence %></p> <% end %> </li> </ul> <% end %> 基礎1:ヘルパーメソッド railsはcrfの対策で下のようにコンパイルされる 「前」 app/views <%= image_tag 'test.jpg', class: 'hoge' %> 「後」 app/views <img src="/assets/test.jpg" class="hoge"> 基礎2:link_to メソッド 第一引数 第二引数 オプション <%= link_to “Topページへ”, “root_path” method: :delete%> *第一引数は表示テキスト *第二引数はリンク先指定 *オプションのデフォルトはGET 基礎3:HTML要素などにリンク付け <%= link_to root_path do %> (html要素)*特に画像・アイコンなど <% end %> 基礎4:1つずつ取り出して @のついたインスタンス変数には通常複数のデータがハッシュで入っています。 1つずつ取り出すメソッドがeachです。 @A.each do |A| 処理 end で間の処理を繰り返します。 3+4 <% @A.each do |A| %> <%= link_to do %> <% end %> <% end %> リンクのついたくさんのHTML要素が出来上がります。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Dockerでrails環境構築

Dockerの勉強用にDockerでrailsの環境構築をした 環境構築手順をまとめる Dockerのインストール 下記URLよりDockerをダウンロードしインストールする. https://docs.docker.com/get-docker/ インストールされていることを確認する $ docker version [:|✔ ] Client: Docker Engine - Community Cloud integration: 1.0.9 Version: 20.10.5 API version: 1.41 Go version: go1.13.15 Git commit: 55c4c88 Built: Tue Mar 2 20:13:00 2021 OS/Arch: darwin/amd64 Context: default Experimental: true Server: Docker Engine - Community Engine: Version: 20.10.5 API version: 1.41 (minimum version 1.12) Go version: go1.13.15 Git commit: 363e9a8 Built: Tue Mar 2 20:15:47 2021 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.4.3 GitCommit: 269548fa27e0089a8b8278fc4fc781d7f65a939b runc: Version: 1.0.0-rc92 GitCommit: ff819c7e9184c13b7c2607fe6c30ae19403a7aff docker-init: Version: 0.19.0 GitCommit: de40ad0 railsの環境構築 インストールしたDockerを利用して、早速railsの環境を構築する 1. 作業用のディレクトリを作る $ mkdir docker_for_rails27 $ cd docker_for_rails27 2. Dockerfileを作成する $ vi Dockerfile # rails2.7.0を指定 FROM ruby:2.7.0 # パッケージインストール RUN apt-get update -qq && apt-get install -y nodejs postgresql-client RUN mkdir /docker_for_rails27 WORKDIR /docker_for_rails27 COPY Gemfile /docker_for_rails27/Gemfile COPY Gemfile.lock /docker_for_rails27/Gemfile.lock RUN bundle install COPY . /docker_for_rails27 COPY entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] EXPOSE 3000 # rails起動コマンド CMD ["rails", "server", "-b", "0.0.0.0"] 3. Gemfileを作る vi Gemfile source 'https://rubygems.org' gem 'rails', '~>5.2.4' 空のGemfile.lockを作成する $ touch Gemfile.lock 4. entrypoint.shを作る dockerの初回起動時に実行されるファイル vi entrypoint.sh #!/bin/bash set -e rm -f /docker_for_rails27/tmp/pids/server.pid exec "$@" 5. docker-compose.ymlを作る $ vi docker-compose.yml version: '3' services: db: image: postgres volumes: - ./tmp/db:/var/lib/postgresql/data environment: - POSTGRES_PASSWORD=postgres web: build: . command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" volumes: - .:/docker_for_rails27 ports: - "3000:3000" depends_on: - db 6. 作成したファイルをもとに環境を構築する $ docker-compose run web rails new . --force --no-deps --database=postgresql --skip-bun $ docker-compose build db uses an image, skipping Building web [+] Building 77.7s (15/15) FINISHED => [internal] load build definition from Dockerfile 0.2s => => transferring dockerfile: 559B 0.1s => [internal] load .dockerignore 0.1s => => transferring context: 2B 0.0s => [internal] load metadata for docker.io/library/ruby:2.7.0 0.0s => [ 1/10] FROM docker.io/library/ruby:2.7.0 0.3s => [internal] load build context 5.9s => => transferring context: 41.27MB 5.8s => [ 2/10] RUN apt-get update -qq && apt-get install -y nodejs postgresql-client 16.2s => [ 3/10] RUN mkdir /docker_for_rails27 0.5s => [ 4/10] WORKDIR /docker_for_rails27 0.1s => [ 5/10] COPY Gemfile /docker_for_rails27/Gemfile 0.1s => [ 6/10] COPY Gemfile.lock /docker_for_rails27/Gemfile.lock 0.1s => [ 7/10] RUN bundle install 56.1s => [ 8/10] COPY . /docker_for_rails27 0.6s => [ 9/10] COPY entrypoint.sh /usr/bin/ 0.1s => [10/10] RUN chmod +x /usr/bin/entrypoint.sh 0.7s => exporting to image 2.6s => => exporting layers 2.6s => => writing image sha256:ea82de4e78548b8d350390c1146a3b486a8dbc00b196d6e7c98f03570552c517 0.0s => => naming to docker.io/library/docker_for_rails27_web 0.0s Successfully built ea82de4e78548b8d350390c1146a3b486a8dbc00b196d6e7c98f03570552c517 7. DBの設定を作成する $ vi config/database.yml default: &default adapter: postgresql encoding: unicode host: db username: postgres password: postgres pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> development: <<: *default database: docker_for_rails27_development test: <<: *default database: docker_for_rails27_test production: <<: *default database: docker_for_rails27_production username: docker_for_rails27 password: <%= ENV['DOCKER_FOR_RAILS27_DATABASE_PASSWORD'] %> 8. コンテナを起動する $ docker-compose up 9. DBを作成する docker-compose upした後に別タブで $ docker-compose run web rake db:create 起動したサーバーにアクセスする http://localhost:3000にアクセスする 詰まった部分 config/database.ymlでhostを設定していなかったため、デフォルトのunix domain socketに接続しようとしてdb:createが出来なかった => host: dbを記載することで解決 その際のエラー connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"? 参考 https://qiita.com/chisaki0606/items/a4b42af5c4735c94057a https://qiita.com/sagahi/items/ef4b04b5498658bf6210 https://teratail.com/questions/178489
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Railsチュートリアルまとめ 第1章

Railsチュートリアル 以前少しチュートリアルをやったことはあるが、こういったqiitaのように他人に伝わりやすい形でアウトプットできていたかと言われればできていなかったかもしれない。 今回はチュートリアルをもう一度やり直してなるべく分かりやすく、かつシンプルにまとめていこうと思う。 目次 1.railsアプリの作成 2.Bundler, Gemfile 3.MVCアーキテクチャの説明 4.簡単なルーティングとアクション 5.gitの使い方 6.herokuにデプロイ 1. railsアプリの作成 railsでアプリケーションを作成する際はまず作成したいディレクトリに移動する。 そしてrails _バージョン_ new アプリ名コマンド実行でアプリケーションを作成できる。 2. Bundler, Gemfile Bunderとはgemのバージョンや依存関係を管理するもの。gemはRubyのライブラリ。 bundle installコマンドでgemのインストールを行う。 gemのバージョンを指定する主な方法は2種類ある。 ①gem 'capybara', '>=2.15' ->最新バージョンのgemがインストールされる。(2.15以上のバージョンならインストールされる) ②gem 'rails', '~>6.0.3' ->gemのバージョンが6.0.3以上で6.1よりも小さい場合にインストールされる。(マイナーバージョンの部分に相当するアップデート済のgemをインストール) bundle installとbundle updateの違い bundle install bundle installはgemfile.lockを元にgemのインストールを行うが、gemfile.lockに記述されていない、gemfileに記述されているgemがある場合はそのgemをインストール。その後gemfile.lockを更新する。 *bundle update bundle updateはgemfileを元にgemのインストールを行い、gemfile.lockを更新する。 bundle updateは本番環境ではgemのバージョンのズレが起こり、アプリがクラッシュしてしまう可能性があるので基本的にはbundle installを使い、ローカルでのみbundle updateを使うべき。 3. MVCアーキテクチャの説明 model ... データベースとのやりとり view ... 表示処理をする controller ... リクエストを処理する Railsアプリの通信の流れはブラウザからリクエストを送り、コントローラに渡されて必要に応じてビューを生成しHTMLをブラウザに送り返すといったようになっている。また、データベースからデータを引き出す必要がある際はコントローラはモデルを呼び出し、モデルはデータベースとやりとりをする。 4. 簡単なルーティングとアクション config/routes.rbに root 'コントローラ名#アクション名' を書くと一番最初のページを指定できる。(ルートに接続する時にどのコントローラのどのアクションに繋がるかを設定できる) app/controllers/application_controller.rbには def アクション名 処理内容 end というように書く。 5. gitの使い方 gitをインストールしたばかりであれば、初めにgit config --global user.name "名前"とgit config --global user.email メールアドレスで名前とメールアドレスを設定する。 gitを使いたい場合はgithubでリポジトリを作成して ①git initコマンドを実行して.gitを作成。 ②git add -A (ファイルをステージング) ③git commit -m "Initialize repository" ④git remote add リポジトリのURL ⑤git push origin master(-uオプションをつけるとgit pushのみでmasterにpushできるようになる) よく使うコマンド * git branch ブランチ名 ... ブランチを作成(-dオプションをつけるとマージされている指定したブランチを削除、-Dオプションならマージされてなくても削除) * git checkout ブランチ名 ... ブランチを切り替える(-bオプションをつければ新規にブランチを作成してそのブランチに移動) * git status ... ステージングの状態を表示する * git log ... コミットメッセージの履歴を参照する ちなみにgit commitメッセージは現在形で命令形で書くようにすること。 6. herokuにデプロイ heroku createでherokuアプリを作成。同時にgit remoteにもherokuが追加される。(git remote -vでリモートを一覧表示) git push heroku masterでデプロイ。 herokuはデフォルトがpostgresqlなのでrailsのデフォルトと違うことに注意。(railsはsqlite3) gemfileに開発環境、テスト環境はsqlite3で本番環境はpgを使うように書く。 herokuでデプロイ時にエラー heroku openでエラーになってしまった。 エラーをみてみるとapp crachedになっているが原因わからず。 こちらを参考にしてheroku run consoleを実行してみると、どうやらherokuでsqliteを使おうとしてしまっていることが分かった。 そこでconfig/database.ymlのproductionの設定を adapter: postgresql database: db/production.pg に変更。 これでコンソールが動いたので再びheroku openでデプロイ成功。 参考文献 以下の記事を参考にさせていただきました。 bundle installとbundle updateの違いについて Railsチュートリアル1章でHerokuにデプロイできない時の対処方法 Qiitaの投稿記事内でページ内リンクや目次リンクを行う方法
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ActionCableでのコメント機能について

ActionCableについて ActionCableとは、通常のRailsアプリケーションと同様の記述で、即時更新機能を実装できるフレームワークです。例えば、メッセージやコメントを即時表示させたい場合に使用します 実装について まずは以下のコマンドをターミナルで打ち込んでください rails g channel message このようになれば成功です。 Running via Spring preloader in process 11084 invoke test_unit create test/channels/message_channel_test.rb create app/channels/message_channel.rb identical app/javascript/channels/index.js identical app/javascript/channels/consumer.js create app/javascript/channels/message_channel.js 今回の実装では以下の2つのファイルについて理解する必要があります。 message_channel.rb クライアントとサーバーを結びつけるためのファイルです。 message_channel.jsの役割 サーバーから送られてきたデータをクライアントの画面に描画するためのファイルです では、さっそくコードを書いていきます。 まずは、サーバーとクライアントを結び付けます。 app/channels/message_channel.rb class MessageChannel < ApplicationCable::Channel def subscribed stream_from "message_channel" end def unsubscribed # Any cleanup needed when channel is unsubscribed end end このとき出てくるstream_fromは、ActionCableで用意されているメソッドでサーバとクライアントを関連づけます。この関連づけられたことで作られるデータの経路をboradcast(ブロードキャスト)と言います。 次にコントローラの編集をしましょう app/controller/messages_controller.rb class MessagesController < ApplicationController def new @messages = Message.all @message = Message.new end def create @message = Message.new(text: params[:message][:text]) if @message.save ActionCable.server.broadcast 'message_channel', content: @message end end end 下から四行目に着目してください。 broadcastを通して、'message_channel'に向けて@messageを送信するという意味です。content:@messageの指定ミスに注意してください。 さて、いよいよjsファイルを編集します。 app/javascript/channels/message_channel.js import consumer from "./consumer" consumer.subscriptions.create("MessageChannel", { connected() { // Called when the subscription is ready for use on the server }, disconnected() { // Called when the subscription has been terminated by the server }, received(data) { const html = `<p>${data.content.text}</p>`; const messages = document.getElementById('messages'); const newMessage = document.getElementById('message_text'); messages.insertAdjacentHTML('afterbegin', html); newMessage.value=''; } }); ここで出てくるdataは送られてくる情報を受け取っています。 data.contentで,createアクションで指定したインスタンス(@message)を取り出しています。 あとは、通常のJavascriptと同様です。なお、newMessage.value="";としているのはメッセージ入力・送信後は入力フォームに文字を残しておきたく泣いためです。 あとはビューファイルを作って終わりです。お疲れ様でした! new.html.erb <%= form_with model: @message do |f| %> <%= f.text_field :text %> <%= f.submit '送信' %> <% end %> <div id='messages'> <% @messages.reverse_each do |message| %> <p><%= message.text %></p> <% end %> </div> 終わりに ActionCableの他にAjaxなどの似たような技術もあるので、そこについてはまた今度執筆します!!!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ActionCableでのメッセージ機能について

ActionCableについて ActionCableとは、通常のRailsアプリケーションと同様の記述で、即時更新機能を実装できるフレームワークです。例えば、メッセージやコメントを即時表示させたい場合に使用します 実装について まずは以下のコマンドをターミナルで打ち込んでください rails g channel message このようになれば成功です。 Running via Spring preloader in process 11084 invoke test_unit create test/channels/message_channel_test.rb create app/channels/message_channel.rb identical app/javascript/channels/index.js identical app/javascript/channels/consumer.js create app/javascript/channels/message_channel.js 今回の実装では以下の2つのファイルについて理解する必要があります。 message_channel.rb クライアントとサーバーを結びつけるためのファイルです。 message_channel.jsの役割 サーバーから送られてきたデータをクライアントの画面に描画するためのファイルです では、さっそくコードを書いていきます。 まずは、サーバーとクライアントを結び付けます。 app/channels/message_channel.rb class MessageChannel < ApplicationCable::Channel def subscribed stream_from "message_channel" end def unsubscribed # Any cleanup needed when channel is unsubscribed end end このとき出てくるstream_fromは、ActionCableで用意されているメソッドでサーバとクライアントを関連づけます。この関連づけられたことで作られるデータの経路をboradcast(ブロードキャスト)と言います。 次にコントローラの編集をしましょう app/controller/messages_controller.rb class MessagesController < ApplicationController def new @messages = Message.all @message = Message.new end def create @message = Message.new(text: params[:message][:text]) if @message.save ActionCable.server.broadcast 'message_channel', content: @message end end end 下から四行目に着目してください。 broadcastを通して、'message_channel'に向けて@messageを送信するという意味です。content:@messageの指定ミスに注意してください。 さて、いよいよjsファイルを編集します。 app/javascript/channels/message_channel.js import consumer from "./consumer" consumer.subscriptions.create("MessageChannel", { connected() { // Called when the subscription is ready for use on the server }, disconnected() { // Called when the subscription has been terminated by the server }, received(data) { const html = `<p>${data.content.text}</p>`; const messages = document.getElementById('messages'); const newMessage = document.getElementById('message_text'); messages.insertAdjacentHTML('afterbegin', html); newMessage.value=''; } }); ここで出てくるdataは送られてくる情報を受け取っています。 data.contentで,createアクションで指定したインスタンス(@message)を取り出しています。 あとは、通常のJavascriptと同様です。なお、newMessage.value="";としているのはメッセージ入力・送信後は入力フォームに文字を残しておきたく泣いためです。 あとはビューファイルを作って終わりです。お疲れ様でした! new.html.erb <%= form_with model: @message do |f| %> <%= f.text_field :text %> <%= f.submit '送信' %> <% end %> <div id='messages'> <% @messages.reverse_each do |message| %> <p><%= message.text %></p> <% end %> </div> 終わりに ActionCableの他にAjaxなどの似たような技術もあるので、そこについてはまた今度執筆します!!!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む