20210909のRubyに関する記事は18件です。

【Rails】フォームのplaceholderを改行する方法

はじめに 今回はフォームの中のplaceholder(下記の画像のもの)を改行する方法について記述します。 開発環境 Ruby on Rails バージョン2.6.5 通常(改行を不要とする場合)の記述 通常改行が不要な場合の記述はこのように記述します <%= f.text_area :hoge, class:"hoge", id:"hoge", placeholder:'ここに表示させる文字を入力します' %> ですが、改行をしたplaceholderを作成する場合は、上記の記述に改行を加えても反映されないので、rails helperを使用することで問題が解消されます! ※rails helperをご存知ない方はまずはこちらの記事をご覧ください! https://qiita.com/yukiyoshimura/items/f0763e187008aca46fb4 rails helperを使用して改行する まずrails helperにplaceholder内容を記述します! app/helpers/表示させたいビュー名_Helper module 表示させたいビュー名Helper def メソッド名 <<-"EOS".strip_heredoc            表示させたい文字            表示させたい文字            表示させたい文字 EOS end end ( <<-"EOS".strip_heredoc 〜 EOS この記述をすることで余分なスペースなどが生まれるのを防ぎます) rails helperにメソッドを定義できれば後はビューファイルにメソッドを呼び出します。 <%= f.text_area :hoge, class:"hoge", id:"hoge", placeholder:rails helperに定義したメソッド名 %> 完成形 先程の記述で無事に改行ができました! ちなみに『<<-"EOS".strip_heredoc 〜 EOS』の記述がないとこのように無駄なスペースが生まれてしまいます。 参考になれば幸いです?‍♂️
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Ruby】正規表現これだけ理解しておこう!

正規表現を苦手としている方は少なくないと思います。 ただ、正規表現に関しては基礎的な部分だけおさえておけば大きな問題はないと思うので、ここで理解を深めてしまいましょう! ある程度自信のある人は一番最後の例題を見てパッと理解できるか確認してみてください。 正規表現とは 正規表現とは、文字列のパターンを表したものです。 正規表現は/ /で囲んで記述します。 正規表現の基礎項目 正規表現を扱う上で必要な基礎項目を列挙していきます。 =~ 正規表現と文字列がマッチするかをどうかを調べるためのメソッドです。 正規表現 =~ 文字列 マッチする場合、文字の位置を返し、マッチしない場合、nilを返します。 puts /a/ =~ "dance" #1 ^ $ \A \z ^は行頭にマッチ $は行末にマッチ \Aは文字列の先頭にマッチ \zは文字列の末尾にマッチ [ ] いくつかの文字のうちその1つを指定したい場合は[ ]で囲む。 /[abc]/ #aかbかc /[a-z]/ #a~z /[^abc]/ #abc以外の文字 ※単なる文字として-を表したい場合は[ ]内の最後に記述します。 . .(ドット)はどんな文字にもマッチする。 /aaa.../ =~ "000aaabcdef" #aaabcdがマッチ \を使った記法 \s 空白文字を表す \S 非空白文字 \d 0~9までの数字にマッチ \w 英数字にマッチ \A 文字列の先頭にマッチ \z 文字列の末尾にマッチ また、メタ文字を普通の文字として使うときは\をつける。 例えば、[に対しては\[とする。 繰り返し * 0回以上の繰り返し + 1回以上の繰り返し ? 0回か1回 {n} n回の繰り返し {n,m} n~m回の繰り返し 「0回以上の繰り返し」の意味が最初はよくわからないかもしれませんが、「直前の文字が1回以上繰り返されているか、なくてもいい」と考えると理解しやすいです。 {n}に関しては5回以上なら{5,}5回以下なら{,5}5~10回なら{5,10}とかけます。 最短マッチ *? 0回以上の繰り返しのうち最短の部分 +? 1回以上の繰り返しのうち最短の部分 *や+は、可能な限り長い部分にマッチさせます。 *?や+?とすると最短部分にマッチするようになります。 string = "abcdabcdabcd" /a.*b/ =~ string #"abcdabcdab"がマッチ string = "abcdabcdabcd" /a.*?b/ =~ string #"ab"がマッチ i オプション iをつけると、アルファベットの大文字小文字の違いを無視する。(どちらでもマッチする) string = "abcdABCDabcd" /a.*b/i =~ string #"abcdABCDab"がマッチ キャプチャ 正規表現を使ってマッチした部分を色々と操作することができます。 ここをおさえられると実用性がグッと高まります。 マッチした結果を保持する変数 $` マッチした部分より前の文字列 $& マッチした部分の文字列 $' マッチした部分より後ろの文字列 string = "abcdef" /c./ =~ string p $` #"ab" p $& #"cd" p $' #"ef" また、正規表現を( )で括った部分を$1で取ることができます。 string = "abcdef" /(.c)/ =~ string p $1 #"bc" 正規表現内で( )が複数つけた場合は順に\$2、\$3でマッチした部分を取ることができます。 gsubメソッド マッチした文字列を別の文字列に置き換えるメソッド。 string = "a b c d e" p string.gsub(/\s+/, " ") #"a b c d e" ブロックを渡すこともできる。 string = "abcabcabc" string.gsub(/.c/) do |matched| p matched end #bc #bc #bc ちなみにsubメソッドは最初にマッチした部分だけを置き換えます。 scanメソッド マッチした部分を取り出す。 置換をしないのであればこっちを使えばいい。 string = "abcabcabc" string.scan(/.c/) do |matched| p matched end #bc #bc #bc 例題 ここまでで基本はいいと思います。 例題をいくつか見てみましょう。 例1 問:emailのドメイン部分を抜き出す。 email = "hogefuga@gmail.com" /\A\S+@(\S+)\z/ =~ email p $1 #"gmail.com" 例2 問:「正規表現は難しい!」を「正規表現は楽しい!」に変更する。 string = "正規表現は難しい!" p string.gsub(/難しい/, "楽しい") #"正規表現は楽しい!" ちなみに、複数の変更をすることもできます。 「正規表現は難しい!無理だ!」を「正規表現は楽しい!ヤッホー!」に変更する。 string = "正規表現は難しい! 無理だ!" p string.gsub(/難しい|無理だ/, "難しい" => "楽しい", "無理だ" => "ヤッホー") 例3 問:"my-name-is-taro"を"My-Name-Is-Taro"のように変換できるメソッドを作る。 def word_capitalize(string) string.gsub(/[a-z]+/, &:capitalize) end p word_capitalize("my-name-is-taro") 例1〜3は、他にもやり方があると思いますので色々試してみてください。 まとめ 正規表現の基本について確認をしました。 rubyの正規表現ですが、例えばJavaScriptでもほとんど同じような形で使えるので、基本をおさえておくと実装の幅が広がるかと思います。 今回は以上です!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Rails]collection_selectにclassをつける

はじめに 本記事では、collection_selectにclassをつける方法を記述します。 うまくいかないコード 第5引数、第6引数にオプションを記述し、第7引数にclass名を指定しています。 <%= search_form_for @q, url: search_foods_path, class: "food-search", id:"pull-down" do |f| %> <%= f.label :shop_name_or_shop_name_kana_or_food_name_or_station_cont, '店名・メニュー名・駅名', class: "search-label" %><br/> <%= f.text_field :shop_name_or_shop_name_kana_or_food_name_or_station_cont, placeholder: "KEYWORD", class: "search-text" %><br/> <%= f.label :user_nickname_cont, 'ユーザー名', class: "search-label" %><br/> <%= f.text_field :user_nickname_cont, placeholder: "KEYWORD", class: "search-text" %><br/> <%= f.label :meal_type_id_eq, '種類', class: "search-label" %><br/> <%# ここ↓ %> <%= f.collection_select :meal_type_id_eq, MealType.all, :id, :name, include_blank: '--', disabled: 0, class: "search-text" %><br/> <%= f.label :spicy_level_id_eq, '辛さ', class: "search-label" %><br/> <%= f.collection_select :spicy_level_id_eq, SpicyLevel.all, :id, :name, include_blank: '--', class: "search-text" %><br/> <%= f.submit "SEARCH", class: "search-submit" %><br/> <% end %> ここが間違えているようです。 <%= f.collection_select :meal_type_id_eq, MealType.all, :id, :name, include_blank: '--', disabled: 0, class: "search-text" %><br/> <%= f.label :spicy_level_id_eq, '辛さ', class: "search-label" %><br/> <%= f.collection_select :spicy_level_id_eq, SpicyLevel.all, :id, :name, include_blank: '--', class: "search-text" %><br/> <%= f.submit "SEARCH", class: "search-submit" %><br/> 修正したコード 第5引数、第6引数にしていたオプションを {}で記述することで、 第5引数にまとめました。 また、第6引数にclass名を指定してましたところ、うまくCSSが効きました。 f.collection_selectの場合は第6引数をclass名にする必要があるらしいです。 オプションの後に{}無しで記述すると、HTMLのオプションと認識されるようです。 <%= search_form_for @q, url: search_foods_path, class: "food-search", id:"pull-down" do |f| %> <%= f.label :shop_name_or_shop_name_kana_or_food_name_or_station_cont, '店名・メニュー名・駅名', class: "search-label" %><br/> <%= f.text_field :shop_name_or_shop_name_kana_or_food_name_or_station_cont, placeholder: "KEYWORD", class: "search-text" %><br/> <%= f.label :user_nickname_cont, 'ユーザー名', class: "search-label" %><br/> <%= f.text_field :user_nickname_cont, placeholder: "KEYWORD", class: "search-text" %><br/> <%= f.label :meal_type_id_eq, '種類', class: "search-label" %><br/> <%# ここ↓ %> <%= f.collection_select :meal_type_id_eq, MealType.all, :id, :name, {include_blank: '--', disabled: 0}, class: "search-text" %><br/> <%= f.label :spicy_level_id_eq, '辛さ', class: "search-label" %><br/> <%= f.collection_select :spicy_level_id_eq, SpicyLevel.all, :id, :name, {include_blank: '--'}, class: "search-text" %><br/> <%= f.submit "SEARCH", class: "search-submit" %><br/> <% end %> 以上です。 終わりに 短時間で解決できましたが、やや特殊なケースかなと思い、記事にしました。 以下参考サイトです。 collection_select not inserting 'class' attribute? collection_selectにclassをつける方法 Railsドキュメント collection_selectタグでclassが反映されない 明日も頑張ります!!!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Ruby] AtCoder過去問 C - Go to School

はじめに AtCoder過去問を解きました。 が、今回正解のコードは出来上がったものの理解し切れていません。。。 解説できる方がおられたら、コメント欄にて教えていただけると幸いです。 問題はこちらから確認ください。↓ C - Go to School この問題かなりややこしくて入力値のaで受け取っているところは、到着した順位を表しています。 先頭から出席番号1です。 出力で表示されている番号たちは順位ではなく、出席番号で、到着した順に並んでいます。 つまり入力値aの添字+1=出席番号です。 これらの情報をもとに、私がはじめに作ったコードはこちら↓ (このコードは不正解です) n = gets.to_i a = gets.split.map(&:to_i) n.times do |x| puts a.index(x+1) + 1 end 上記のコード間違っているかどうかと言うより、処理時間が長すぎて不正解となりました。 この手の問題は繰り返し処理を行うと処理時間長すぎで不正解となることが最近わかってきました。 これが間違っていると言うことは配列の順番を並び替える処理だけで行うべきだと考えました。 しかし、冒頭で述べた通り入力と出力は同じ数字に見えても、データとしては別物なのでとても扱いにくいです。 いろんな人の回答を参考にして、最終的に下記のようなコードを作りました。 かなりシンプルです。 n = gets.to_i a = gets.split.map(&:to_i) puts a.sort_by{|i| a[i-1]} 紙に書き出して、自分で入力値を代入して、正解になるのはわかるのですが、どれだけ考えても理屈はわからずじまい。。。 説明できる方おられたらコメントで教えてもらえると幸いです。。。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rubyってなんやねん

こんにちは! スクールのカリキュラムの通りに実装を進めて教材の通りに Ruby on RailsでWebアプリケーション作成しました。 しかしふと思ったんです。 何でRuby? ラビットの麒麟川島「Rubyだ」 PHP、Java, Pythonとあって何でRubyを俺は使ってる?? と思いました。 まさしく僕は誰?状態です。 メモ用としてRubyのことについてディグっていきたいと思います。 いつできて誰が作ったの? Rubyが生まれたのは1995年です。 はいそうです、僕と同い年です。 しかも開発された方は日本人の まつもとゆきひろさんという方だそうです!! 海外旅行に行くと レペゼンジャパンはドラゴンボールやキャプテン翼などが挙げられますが、 エンジニア界隈では「Rubyやん!」と言われることもあるんじゃないの。 Rubyの特徴 動的型付き言語でありシンプルな構文なので記述量が少なく、 プログラミング初心者でも比較的入りやすい言語のようです。 また、オブジェクト指向を採用しているため、保守、運用に優れています。 これ初めて聞いた時、因みに僕はこう思いました。 どこがやねん めちゃくちゃ何言ってんのかわからんがな。 数こなしていく内に点と点が線でつながるようになりましたが、 プログラミングにおいて数をこなす事が大事だったのかなと今では思っています。 動的型付き言語???? むちゃくちゃわからん単語出てきたがな。理解できんまま進めんわ。 ということで調べてみました。 そもそも動的と静的という言葉はなんやと思い調べると 動的:状況によって状態を変える 静的:状況によらず状態を変えない だそうです。 動的サイトならユーザーの要求で表示内容を変えるサイト 静的サイトならいつでも表示する内容が変わらないサイト と言えます。 これを踏まえて 動的型付け言語とは 変数などのデータ型の宣言がいらない言語のことで、 静的型付け言語とは、 変数などのデータの定義が必要な言語 ということです。 記述の違いを見て考えていきましょう。 動的型付け言語の記述例 a = 2 b = 3 puts a + b 簡単に書けますね。実行結果は5です。 静的型付け言語の記述例 #include <iostream> using namespace std; int main() { int a = 2; int b = 3; cout << a + b << endl; return 0; } いやなっが。 すごいですね計算結果5を出す為だけにこんなに記述しないといけないのか。 int型という整数の変数a,bが定義されています。 動的型付けと静的型付けを比較して解ること 動的型付け言語なら変数などのデータ型の宣言がいらないので 記述量が大幅に減り、比較的容易にプログラムを書くことができます。 短く簡単にプログラムをかけるんなら全部動的型付け言語でええやんけと 思いました。 静的型付け言語のメリットについても考察してみました。 コンパイル時にエラーが発生 パフォーマンスの向上 コンパイル時にエラーが発生 コンパイル時にエラーが発生するので プログラムを実行する前にエラーを特定することが可能です。 int型の変数なのに文字列を代入しようとしてしまってるとかですかね。 確かに動的型付け言語だとプログラムが実行された後にエラーが発生するので 見返すのに時間がかかったりしちゃうんですよね。 パフォーマンスの向上 静的型付け言語ならデータの型が分かるので、 整数同士の計算や 小数同士の計算が プログラム実行前に解る。 データの定義がされているのでコードを見返すのが楽ちんですね。 また、Rubyはインタプリタ方式を採用しています。 インタプリタ方式とコンパイル方式 インタプリタ方式とは簡単にいうと プログラムの内容を人間がわかる言葉からコンピュータがわかる言語へ一つずつ翻訳しながら動かす方式のことです。 人間がプログラムを入力→ 入力されたプログラムをコンピュータが解るように翻訳→ 翻訳された命令に従ってコンピュータが仕事を実行する というそんな流れ。 この入力されたプログラムを1行ずつ繰り返すのがインタプリタ方式です。 彦摩呂のグルメコメントでインタプリタ方式を例えてみましょう。 彦摩呂がウルフギャングでステーキを頬張る(人間がプログラムを入力)→ 彦摩呂の心の声「ん?ジューシーやな?これは何てコメントしよかいな」(入力されたプログラムをコンピュータが解るように翻訳)→ 彦摩呂がコメント「味のIT革命や〜」(翻訳された命令に従ってコンピュータが仕事を実行する) コンパイル方式は入力されたプログラムを全部翻訳しその翻訳された プログラムを実行する方式です。 コンパイル方式を彦摩呂で例えてみましょう。 彦摩呂がステーキを完食する(人間が入力したプログラムをコンピュータが全て翻訳)→ 彦摩呂のコメント「赤かぁ~。てんこ盛り~~っ!食べ物を美味しく表現するのが僕の使命です~。お肉と野菜とタレの騎馬戦や~。肉汁のドリンクバーや~。」(翻訳されたプログラムを基にコンピュータが実行) Rubyのデメリット インタプリタ方式を採用してるから処理速度が遅いんですよね。 上記の彦摩呂のグルメコメントを例を基に考えてみましょう。 インタプリタ彦摩呂はステーキを一口一口頬張るごとに、 いちいちコメントをしています。 それに対してコンパイル彦摩呂はステーキを完食してから 考えたコメントを発言しています。 食べ終える時間が遅いのは明らかにインタプリタ彦摩呂ですよね。 インタプリタ方式を採用するということは、コードの記述量が増えれば増えるほど 処理速度が遅くなるということです。 食べる量が増えれば増えるほど彦摩呂は食べ終えるのに時間がかかりますよね。 だから大規模なアプリや処理速度が命のアプリなものには Rubyは向いていないと言えますね。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rails | バリデーション validates と validate の違い

モデル(model)にバリデーションを書く際に使い分けすることがあったのでメモ。 それぞれの違いについて validates 標準のバリデーションを書くときはこれ 使い方はRailsガイドを参照 https://railsguides.jp/active_record_validations.html validate 自分でオリジナルのバリデーション用メソッドを書くときはこれ validateの使用例 model validate :photo_size, :photo_length private def photo_size photos.each do |photo| if photo.blob.byte_size > 5.megabytes photo.purge errors.add(:photos, "は1つのファイル5MB以内にしてください") end end end def photo_length if photos.length > 10 photos.purge errors.add(:photos, "は10枚以内にしてください") end end 私はActiveStorageでバリデーションを作成した際に違いに気づき、疑問に思ったので残しておきます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ログイン実装について、Devise/Warden/Rack の関係を一言で

Rails のログイン実装でお馴染みの Devise について調べたため、メモを残します。引用元を合わせて記します。 Devise とは? ・Rails に認証を実装するためのソリューションのこと ・Warden がベースになっている Devise is a flexible authentication solution for Rails based on Warden. −− Github Warden とは? ・Rack 内で、認証するメカニズムを与えてくれるもの Warden provides a mechanism for authentication in Rack based Ruby applications. −− Github つまり、 1. Rack 内で、 2. Warden というものが認証するメカニズムを提供し、 3. Deviseがそのメカニズムを Rails に実装してくれる。 ということですね! Rack とは? ・Ruby で、WEB開発をするためのインターフェースを与えてくれるもの ・HTTPリクエストとHTTPレスポンスを束ねて、APIとし、シングルメソッドコールにしてくれるもの(要は、Rack のおかげで API が打てるということですね) Rack provides a minimal, modular, and adaptable interface for developing web applications in Ruby. By wrapping HTTP requests and responses in the simplest way possible, it unifies and distills the API for web servers, web frameworks, and software in between (the so-called middleware) into a single method call. −− Rails guides ちなみに、この文章での distills the API(一般的に distills は「蒸留する」)の意味が最初は謎でした。(APIを蒸留するとは…?)そこで、オックスフォード英英辞典を参考にしました。↓↓ distil sth (from/into sth) to get the essential meaning or ideas from thoughts, information or experiences -- Oxford Academic English なるほど、distills には「インフォメーションからエッセンシャルなものを取り出す」というような意味合いがあるみたいですね。参考にしてください。 まとめ Rack 内で、Warden による認証メカニズムを、 Devise が Rails に実装してくれる。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Example title

Example
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

バリデーションとは?

昨日の学習の復習です! バリデーション、、 クライアントが入力した情報(データ)をデータベースに保存するときに、制約をかけること!(バリアを張ることって自分は覚えています) 例えば 名前とメールが空(入力されてない)だと登録できませんよー 何文字以内にしてね! 数字しか許さん   などなど そこで使われるのが、、、 validatesメソッド!!! バリデーションを設定する時に使用するメソッド こんな風にバリデーション(バリア)します validates :カラム名, バリデーションの種類 1つ例として validates :name, presence: true バリデーションの種類でpresence: trueと書くことでnameカラムが空だと登録できませんよーというバリデーションを制約(バリア)をかけている 以上!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ターミナルでActionView::Template::Error

今日、初歩的なミスでずっと引っかかってしまいました エラー内容 NoMethodError undefined method errors' for nil:NilClass` ↓ターミナル ActionView::Template::Error (undefined method `errors' for nil:NilClass): 1: <% if model.errors.any? %        2: <div class="error-alert"> 3: <ul> 4: <% model.errors.full_messages.each do |message| %> nil:NilClassから、『クラスがないよ!』 undefined method から『メソッドが未定義なんだが、、、』 というエラーということが考えられます。 原因    views/new.html.erd </header> <div class="items-sell-main"> <h2 class="items-sell-title"> 商品の情報を入力 </h2> <%= form_with model:@items, local: true do |f| %> <%= render 'shared/error_messages', model: f.object %> controllers/items_controller.rb def new @item = Item.new end コントローラーとビューファイルの記述を見ると、 コントローラーは@itemと定義 ビューファイルは@itemsと定義 ここの部分を@itemに統一して、直したら解消されました。 コントローラーに合わせてビューファイルを@itemに変更するだけでした。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【エラー】rails new APP_PATH [options]

概要 Usage: rails new APP_PATH [options] Options: [--skip-namespace], [--no-skip-namespace] # Skip namespace (affects only isolated engines) [--skip-collision-check], [--no-skip-collision-check] # Skip collision check -r, [--ruby=PATH] # Path to the Ruby binary of your choice # Default: /Users/fujitanisougaku/.rbenv/versions/2.6.6/bin/ruby -m, [--template=TEMPLATE] # Path to some application template (can be a filesystem path or URL) -d, [--database=DATABASE] # Preconfigure for selected database (options: mysql/postgresql/sqlite3/oracle/sqlserver/jdbcmysql/jdbcsqlite3/jdbcpostgresql/jdbc) # Default: sqlite3 [--skip-gemfile], [--no-skip-gemfile] # Don't create a Gemfile -G, [--skip-git], [--no-skip-git] # Skip .gitignore file [--skip-keeps], [--no-skip-keeps] # Skip source control .keep files -M, [--skip-action-mailer], [--no-skip-action-mailer] # Skip Action Mailer files [--skip-action-mailbox], [--no-skip-action-mailbox] # Skip Action Mailbox gem [--skip-action-text], [--no-skip-action-text] # Skip Action Text gem -O, [--skip-active-record], [--no-skip-active-record] # Skip Active Record files [--skip-active-job], [--no-skip-active-job] # Skip Active Job [--skip-active-storage], [--no-skip-active-storage] # Skip Active Storage files -P, [--skip-puma], [--no-skip-puma] # Skip Puma related files -C, [--skip-action-cable], [--no-skip-action-cable] # Skip Action Cable files -S, [--skip-sprockets], [--no-skip-sprockets] # Skip Sprockets files [--skip-spring], [--no-skip-spring] # Don't install Spring application preloader [--skip-listen], [--no-skip-listen] # Don't generate configuration that depends on the listen gem -J, [--skip-javascript], [--no-skip-javascript] # Skip JavaScript files [--skip-turbolinks], [--no-skip-turbolinks] # Skip turbolinks gem [--skip-jbuilder], [--no-skip-jbuilder] # Skip jbuilder gem -T, [--skip-test], [--no-skip-test] # Skip test files [--skip-system-test], [--no-skip-system-test] # Skip system test files [--skip-bootsnap], [--no-skip-bootsnap] # Skip bootsnap gem [--dev], [--no-dev] # Set up the application with Gemfile pointing to your Rails checkout [--edge], [--no-edge] # Set up the application with Gemfile pointing to Rails repository [--master], [--no-master] # Set up the application with Gemfile pointing to Rails repository main branch [--rc=RC] # Path to file containing extra configuration options for rails command [--no-rc], [--no-no-rc] # Skip loading of extra configuration options from .railsrc file [--api], [--no-api] # Preconfigure smaller stack for API only apps [--minimal], [--no-minimal] # Preconfigure a minimal rails app -B, [--skip-bundle], [--no-skip-bundle] # Don't run bundle install --webpacker, [--webpack=WEBPACK] # Preconfigure Webpack with a particular framework (options: react, vue, angular, elm, stimulus) [--skip-webpack-install], [--no-skip-webpack-install] # Don't run Webpack install Runtime options: -f, [--force] # Overwrite files that already exist -p, [--pretend], [--no-pretend] # Run but do not make any changes -q, [--quiet], [--no-quiet] # Suppress status output -s, [--skip], [--no-skip] # Skip files that already exist Rails options: -h, [--help], [--no-help] # Show this help message and quit -v, [--version], [--no-version] # Show Rails version number and quit Description: The 'rails new' command creates a new Rails application with a default directory structure and configuration at the path you specify. You can specify extra command-line arguments to be used every time 'rails new' runs in the .railsrc configuration file in your home directory, or in $XDG_CONFIG_HOME/rails/railsrc if XDG_CONFIG_HOME is set. Note that the arguments specified in the .railsrc file don't affect the defaults values shown above in this help message. Example: rails new ~/Code/Ruby/weblog This generates a skeletal Rails installation in ~/Code/Ruby/weblog. プロジェクトを認識していない時に発生する。 環境構築やディレクトリに不備が考えられる。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

チラ裏。if,elseの問題

問題 「ポイント付与サービスを考えます。 購入金額が999円以下の場合、3%のポイント 購入金額が1000円以上の場合、5%のポイント このように付与されるポイントを出力するメソッドを作りましょう。 ただし誕生日の場合はポイントが5倍になります。 誕生日の場合はtrue, 誕生日でない場合はfalseで表します。 また、小数点以下をすべてのポイント計算が終わったあとに切り捨てましょう。 呼び出し方: calculate_points(amount, is_birthday)」 step1 購入金額が999円以下なのかまたは1000円以上なのかを判断したいので、条件分岐後ポイント計算をした後に結果を変数pointに代入します。 qiita.rb if amount <= 999 point = amount * 0.03 else point = amount * 0.05 end step2 誕生日の場合は、直前で定義した変数pointに5をかける処理を行います。 qiita.rb if is_birthday point = point * 5 end step3 小数点以下を切り捨てたポイント数を出力させたいので、ポイント数の記述部分に'.floorメソッド'を使用。 qiita.rb puts "ポイントは#{point.floor}点です" 最後に指定された呼び出し方に添って記述し、完了。 qiita.rb def calculate_points(amount, is_birthday) if amount <= 999 point = amount * 0.03 else point = amount * 0.05 end if is_birthday point = point * 5 end puts "ポイントは#{point.floor}点です" end 備忘録を兼ねているので、私の恥ずかしい初回回答も掲載。 反省しているので触れないでください、、、 qiita.rb 〜悪い例〜 def calculate_points(a,b) if b && a <= 999 puts "ポイントは#{a * 0.03 * 5.floor}点です" elsif b && a >= 1000 puts "ポイントは#{a * 0.05 * 5.floor}点です" elsif a <= 999 puts "ポイントは#{a * 0.03.floor}点です" else puts "ポイントは#{a * 0.05.floor}点です" end end 〜悪い例〜 以上
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Railsのインストールでつまづいたこと(原因はONEDRIVE)

もう腹が立って仕方がない 結局は個人のデスクトップフォルダが、知らない間にOnedriveにリンクされていて、 権限の関係でインストールが出来なかったからである。 それにしても、腹が立つ・・・ 以下の環境はどちらも駄目だった。 WSL/Ubuntu MYSYS2/MinGW デスクトップフォルダ ずいぶん前は C:\Users\motoc\デスクトップ\rails 最近、こうなっている C:\Users\motoc\OneDrive\デスクトップ\rails 知らない間に、こんなクソ仕様にしやがって・・・ しばいたろか! フォルダ C:\Users\motoc\OneDrive\デスクトップ\rails motoc@DESKTOP-5GGB0DP MINGW64 ~ $ cmd.exe /c "chcp 65001" Active code page: 65001 motoc@DESKTOP-5GGB0DP MINGW64 ~ $ cmd.exe /c "mklink /j rails C:\Users\motoc\OneDrive\デスクトップ\rails" Junction created for rails <<===>> C:\Users\motoc\OneDrive\デスクトップ\rails エラー内容 $ bin/rails s C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/bootsnap-1.8.1/lib/bootsnap/compile_cache/iseq.rb:30:in `fetch': No such file or directory - bs_fetch:open_current_file:open (Errno::ENOENT) from C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/bootsnap-1.8.1/lib/bootsnap/compile_cache/iseq.rb:30:in `fetch' ... 省略 解決方法 下記のフォルダに変更 C:\Users\motoc\rails motoc@DESKTOP-5GGB0DP MINGW64 ~ $ cmd.exe /c "mklink /j rails C:\Users\motoc\rails" Junction created for rails <<===>> C:\Users\motoc\rails 無事に動いた motoc@DESKTOP-5GGB0DP MINGW64 ~/rails/railsample $ bin/rails s => Booting Puma => Rails 5.2.6 application starting in development => Run `rails server -h` for more startup options *** SIGUSR2 not implemented, signal based restart unavailable! *** SIGUSR1 not implemented, signal based restart unavailable! *** SIGHUP not implemented, signal based logs reopening unavailable! Puma starting in single mode... * Version 3.12.6 (ruby 2.6.8-p205), codename: Llamas in Pajamas * Min threads: 5, max threads: 5 * Environment: development * Listening on tcp://localhost:3000 Use Ctrl-C to stop Started GET "/" for ::1 at 2021-09-09 10:41:43 +0900 Processing by Rails::WelcomeController#index as HTML Rendering C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/railties-5.2.6/lib/rails/templates/rails/welcome/index.html.erb Rendered C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/railties-5.2.6/lib/rails/templates/rails/welcome/index.html.erb (7.3ms) Completed 200 OK in 32ms (Views: 25.0ms | ActiveRecord: 0.0ms)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

○○のインスタンス変数の情報の有無で条件分岐させたい時に使うメソッド

はじめに 学習の備忘録です。 Ruby on Rails 6.0、MySQLでアプリケーションを開発しています。 やりたいこと あるモデルに登録されている情報を、トップページに表示する実装を学習。 モデルに情報が登録されている場合はモデル内の情報を一覧で表示できるようにし、 モデルに情報がない場合はダミーのデータ(後述の配置例では文字列)を表示するように実装します。 上記の通り、条件分岐の記述が必要になるのでif文を使います。 まずトップページにモデルの情報を取得できるようにルーティングとアクションを設定します。 routes.rb Rails.application.routes.draw do resources :items, only: [:index, :new, :create] end items_controller.rb class ItemsController < ApplicationController def index @items = Item.all end end ここからif文を作成していきます。 上記でコントローラーに、モデルの情報を全て取得できるように設定したインスタンス変数を使い、情報を呼びだしつつ、 今回の条件であるモデルに情報がある場合どうするのかを設定するためのメソッドを使います。 それがpresentメソッドです。 presentメソッドとは Railsにおいて、presentメソッドはオブジェクトであるレシーバーの値が存在すればtrue、存在しなければfalseを返すメソッドです。 下記のように?をつけて使用します。 <% if インスタンス変数.present? %> こう記述することにより、インスタンス変数に値が入っていればtrueを返し、 これに続く値が入っていた場合の処理を実行します。 値が入っていない、もしくはインスタンス変数そのものが存在しない場合はfalseを返し、 処理をしない、もしくは値が入っていない場合の処理を行います。 以上を踏まえて、ビューファイルに記述すると下記のようになります。 配置例 index.html.erb <% if @items.present? %> # ↓下記は取得した情報を並べて表示するための記述です↓ <% @items.each do |item| %>                    中略 # ↑上記は取得した情報を並べて表示するための記述です↑ <% else %> アイテムはありません <% end %> <% end %> おまけ presentメソッドと似たような機能を持つメソッドがありますので紹介します。 (Railsのpresentの使い方を現役エンジニアが解説【初心者向け】より抜粋) nil?メソッド 変数.nul? このメソッドでtrueが返ってくる時は、レシーバーである変数そのものが存在しない時ということになります。 empty?メソッド 変数.empty? このメソッドでtrueが返ってくる時は、レシーバーである変数に値が何も入っていない時ということになります。 blank?メソッド 変数.blank? このメソッドでtrueが返ってくる時は、レシーバーである変数そのものが存在しないか、変数に値が何も入っていない時ということになります。 nul?メソッドとempty?メソッド両方の機能を併せ持つメソッドです。 また、present?メソッドと逆の機能を持っているとも言えます。 終わり
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Ruby on Rails】link_toメソッドをリンクではなくボタンとして使う方法

対象者 link_toメソッドの使い方を知りたい方 目的 link_toメソッド使ってviewでボタンを表示する 実際の手順と実例 1.link_toメソッドの表示の違い a. 基本的な構文 <%=link_to "表示する文字", "URL" %> 上記の書き方だとテキストリンクになってしまう b. doとendで囲う方法 <%= link_to URL do %>    表示する文字 <% end %> これでボタン化できます。 2. 実際の使用例 下記サイトを参考に表示テキストがホバーすると変わるボタンを実装 上記記事のHTMLコードは下記の通り index.html <a href="#" class="btntextchange"> <span>About</span><span>私たちについて</span> </a> ※CSSは省略します。class="btntextchange"に表示を切り替えるcssのコードが書かれています。 これをRailsのコードに置き換えて実験してみた index.html.erb <a href="#" class="btntextchange"> <span><%=link_to "About", "about_path" %></span> <span><%=link_to "私達について", "about_path" %></span> </a> 上記の書き方だとボタン化できません。 原因としては、link_toメソッドを使用することでaタグのHTMLが作成され、二重に精製されてしまっていることが考えられます。 3.例の解決方法 下記のようにボタン化して解決できます。 index.html.erb <%= link_to about_path do %> <div class="btntextchange">              <span>About</span>              <span>私たちについて</span>          </div> <% end %> 上記のようにHTMLコードを挟み込むことで、 ボタンとして活用できます! 参照 【Rails入門】link_toの使い方とオプションをわかりやすく解説! 【Rails基礎】link_toメソッドをボタン化して使う方法
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Python】【Ruby】【Java】ビンゴカード作成問題!

 現在僕はPythonを学んでいます。Pythonを学び始めて1週間ほどが経過したので、過去にRubyやJavaで作成していたプログラムをPythonでも作ってみることにしました。 B:1~15のどれか I:16~30のどれか N:31~45のどれか G:46~60のどれか O:61~75のどれか B | I | N | G | O 13 | 22 | 32 | 48 | 61 3 | 23 | 43 | 53 | 63 4 | 19 | | 60 | 65 12 | 16 | 44 | 50 | 75 2 | 28 | 33 | 56 | 68  上記のような出力結果を得るプログラムになります。 Rubyの場合 Javaの場合 Pythonの場合  以上の流れでコードを載せていきます。 Rubyの場合 puts " B | I | N | G | O" b = (1..15).to_a.sample(5) i = (16..30).to_a.sample(5) n = (31..45).to_a.sample(5) g = (46..60).to_a.sample(5) o = (61..75).to_a.sample(5) 5.times do |count| printf("%3d", b[count]) print " |" print " #{i[count]} |" if count == 2 print " |" else print " #{n[count]} |" end print " #{g[count]} |" print " #{o[count]} " puts "\n" end  後半部分はもう少し綺麗な記述ができそうです。 Javaの場合 package example; import java.util.ArrayList; import java.util.Collections; public class Bingo { public static void main(String[] args) { ArrayList<ArrayList<Integer>> lists = new ArrayList<ArrayList<Integer>>(); int num = 1; for (int i = 0; i <= 4; i++) { ArrayList<Integer> list = new ArrayList<>(); for (int j = num; j <= num + 14; j++) { list.add(j); } Collections.shuffle(list); lists.add(list); num += 15; } System.out.println(" B | I | N | G | O"); for (int i = 0; i <= 4; i++) { for (int j = 0; j <= 4; j++) { if (i == 2 && j == 2) { System.out.print(" "); } else { System.out.printf("%3d", lists.get(j).get(i)); } if (j != 4) { System.out.print(" |"); } } System.out.println(); } } } Pythonの場合  今回作ったPythonでのビンゴカード作成問題です。Rubyとほぼ同じやり方で解きました。Pythonの方がRubyよりもシンプルな記述が可能な印象です。  「sample」のように、重複なしで特定の範囲から複数の値を取得できるメソッドがJavaでは見当たらなかったため、Javaの場合はその辺が少し複雑になっています。 import random b = random.sample(range(1,16),5) i = random.sample(range(16,31),5) n = random.sample(range(31,46),5) g = random.sample(range(46,61),5) o = random.sample(range(61,76),5) print(" B | I | N | G | O ") for j in range(5): print("%3d" % b[j],end=" |") print("%3d" % i[j],end=" |") if j == 2: print(" ",end=" |") else: print("%3d" % n[j],end=" |") print("%3d" % g[j],end=" |") print("%3d" % o[j])  ご意見いただけると非常に勉強になります。よろしくお願いいたします。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Ruby】配列を制するものはRailsを制す。

Rubyの配列の基本についてまとめます。 実際にRailsでアプリを実装するときなどには、配列は頻繁に扱うことになります。 配列をうまく扱うことができれば実装力が増すことは間違いありません! 配列の作り方 普通に[]でくくればできますが、それ以外の方法を簡単に見ておきましょう。 Array.new array = Array.new(3, 'ok') p array #["ok", "ok", "ok"] splitメソッド string = 'taro jiro saburo' array = string.split(' ') p array #["taro", "jiro", "saburo"] 要素を取り出す・置き換える・挿入する 要素を取り出す array = ["taro", "jiro", "saburo"] new_array = array[1..2] #["jiro", "saburo"] 要素を置き換える array = ["taro", "jiro", "saburo"] array[0] = "me" #["me", "jiro", "saburo"] array[0..1] = ["me", "my brother"] #["me", "my brother", "saburo"] 要素を挿入する 要素を挿入する場合はarray[n, 0] = 挿入したい要素と書きます。 nの直前に要素を挿入します。 array = ["taro", "jiro", "saburo"] array[1, 0] = "hanako" #["me", "hanako", "jiro", "saburo"] 複数のインデックスを指定して配列をつくる array = ["taro", "jiro", "saburo"] new_array = array.values_at(0, 2) #["taro", "saburo"] 集合としての配列 数学で集合を学習したことを覚えているでしょうか。 配列を1つのまとまりとして捉えることもできるわけですね。 共通集合 2つの集合のどちらにも含まれている要素を取り出す。 array1 = [1,3,5,7,9] array2 = [1,2,5,6,9,10] new_array = array1 & array2 #[1, 5, 9] 和集合 どちらか一方にでもある要素を集める。 array1 = [1,3,5,7,9] array2 = [1,2,5,6,9,10] new_array = array1 | array2 #[1, 3, 5, 7, 9, 2, 6, 10] 集合の差 array1 = [1,3,5,7,9] array2 = [1,2,5,6,9,10] new_array = array1 - array2 #[3, 7] 集合の和 和集合とのちがいは、重複する要素があっても全部足し合わせます。 (重複しているものを除きたい場合は|を使います。) array1 = [1,3,5,7,9] array2 = [1,2,5,6,9,10] new_array = array1 + array2 #[1, 3, 5, 7, 9, 1, 2, 5, 6, 9, 10] まとめ Rubyの配列の基本について見てきました。 ここで見てきたものをしっかりマスターしておくだけでも配列の扱いが容易になると思います。 Railsなどの開発にも生きてくると思います。 今回は以上です!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Ajax]コメント機能を非同期通信にした

はじめに 本記事では、コメント機能を非同期通信にした方法を記述しています。 過去に、いいね機能とフォロー機能を非同期通信にしている記事も書いておりますので、 参照ください。 前提 コメント機能は同期通信にはできる状態です。 該当箇所のみの記載です。 コード コントローラー food(投稿した食べ物)の詳細画面(show)にてコメントできる仕様です。 show内で完結するので、newメソッドもあります。 createメソッドでもコメントできましたが、 コメントはcommentテーブルに保存するので、newの方が良いと思っています。 foods_controller.rb 省略 def show @food = Food.find(params[:id]) @like = Like.new @comment = Comment.new @comments = @food.comments.order("created_at DESC") end 省略 ここも特に同期通信と変わりません。 merge(user_id: current_user.id ,food_id: params[:food_id]) ここ忘れないように。 comments_controller.rb class CommentsController < ApplicationController def create @food = Food.find(params[:food_id]) @comment = Comment.create(comment_params) @comments = @food.comments.order("created_at DESC") end private def comment_params params.require(:comment).permit(:text).merge(user_id: current_user.id ,food_id: params[:food_id]) end end モデル 同期通信と変わりません。 belongs_toとかhas_manyなどですので、省略します。 ビュー 記事を書いててミスを見つけました。 localsがlacalsになっていました、、、 あっぶね〜? ・・・ <div class="food-comments-contents-<%= @food.id %>"> クラス名に-<%= @food.id %>を入れないと何の投稿に対するコメントなのか わかりませんので、ここが抜けているとリロードしないとコメントが反映されないと思います。 コードが長いので、部分テンプレートにしています。 foods/show.html.erb 省略 <h2 class="show-food-comments-title">Comments !</h2> <div class="food-comments-contents-<%= @food.id %>"> <%= render partial:"comments/comment", locals: {food: @food} %> </div> 省略 comments/_comment.html.erb 3行目にremote: trueを入れます。 これにより非同期通信が可能になり、リクエストがjs形式になります。 <div class="comments-comment-contents"> <% if user_signed_in? %> <%= form_with(model: [@food, @comments],url: food_comments_path(@food,@comment), remote: true) do |f| %> <%= f.text_area :text, placeholder: "コメントする", rows: "2", class: "food-comment-textbox" %> <%= f.submit "SEND" ,class: "food-comment-textbox-send" %> <% end %> <ul class="show-food-comments"> <% @comments.each do |comment| %> <li class="show-food-comment"> <div class="comment-food-post-users"> <div> <%= link_to user_path(comment.user_id) do %> <% if comment.user.icon.present? %> <%= image_tag comment.user.icon, class: "icon-img" %> <% else %> <i class="fas fa-user-circle"></i> <% end %> <% end %> </div> <div> <%= link_to user_path(comment.user_id),class: "comment-food-post-user" do %> <%= comment.user.nickname %> <% end %> <%= comment.text %> </div> </div> </li> <% end %> </ul> <% else %> <p class="please-login">コメント閲覧・投稿する際は<br/>「新規登録」「ログイン」をお願いします</p> <% end %> </div> comments/create.js.erb リクエストがjs形式のため、 ファイル名はcreate.js.erbになります。 先ほどfoods/show.html.erbにて作った クラスfood-comments-contents-<%= @food.id %>が また部分テンプレートのcomments/commentに行きます。 これでcreate=コメントしたということが反映されます。 $(".food-comments-contents-<%= @food.id %>").html("<%= j(render partial: 'comments/comment', locals: {food: @food}) %>") 以上です。 いいねやフォローに比べればまだ簡単なように思えます。 終わりに 私が作成したアプリはコメント機能を非同期化しています。 昨今のアプリでコメント機能が非同期化していないアプリはありませんね。 必ず導入するべきだと思います。 また、いいね機能やフォロー機能を非同期化していれば、 少し考えればコメント機能の非同期化は容易ですので、 いいね機能とフォロー機能の非同期化もマスターしたいところです。 以下参考サイトです。 [Rails]Ajaxを用いて非同期でコメント機能の実装 Railsアプリに非同期通信のコメント機能を実装 明日も頑張ります!!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む