- 投稿日:2020-10-14T23:56:25+09:00
【Rails】画像をアップロードせずに編集するとデフォルトの画像で上書きされてしまう問題の解決方法【ActiveStorage】
現在、個人開発中のアプリがかなり完成に近づきつつある中、新たに新しいバグを見つけてしまいました、、(リリース前に気付いてよかった)
前置き長いんで、さっさと解決策知りたい方はこの辺飛ばしちゃってください!!
プロフィール画像などの画像のアップロード機能をActiveStorageを使い実装したのですが、以下のようなバグが見つかりました。
例えば、あるユーザーがユーザー編集ページで画像の設定をしたとします。そして、次にパスワードを変更したくなったとします。当然、ユーザーは新しいパスワードのみ入力し、その値が編集ページのフォームからポストされます。
このとき、フォームのファイル選択エリア(file_field)には前回アップロードした画像は設定されていないので、この状態でupdateアクションが実行されてしまうと前回アップロードした画像が消えてしまい、アプリで設定しているデフォルトの画像で上書きされてしまうのです。つまり、このままでは編集をするたびに毎回画像をアップロードしないと画像の変更を維持できないという最悪のUXをユーザーに提供してしまいます。これはなんとかしなければいけませんね、、というわけで解決策を書きます!
解決策(超簡単)
コントローラーに以下を追記します。
users_controller.rbdef update @user = User.find(params[:id]) @user.avatar.attach(params[:avatar]) if @user.avatar.blank? if @user.update(user_params) flash[:success] = 'プロフィールを更新しました' redirect_to @user else render 'edit' end endif @user.avatar.blank?を追記するだけです!
実は、ググってもググってもActiveStorageですでに設定された画像のキャッシュを作成するやり方がわからなかったので、自分で考えて色々と仮説検証した結果この一文を編み出し、解決することができました。(CarrierWaveなら出てきた)
テストもパスすることを確認しました。(この一文を消すとちゃんとテストに失敗することも確認済)しかし、これだと
既に設定されている画像を普通に変更する場合、
@user.avatar.bkank?
がfalseになって@user.avatar.attach(params[:avatar])
が実行されずに画像の変更ができないんじゃないか?と思いませんか?僕は思います。。wでも、実際画像は更新されるし、テストもパスするのでとりあえずこれで良しとしようと思います。
どなたかこのあたりの原理が分かる方、もしよければコメントいただけますと幸いです。
テストコード
補足として実際にパスしたテストコードをここに掲載します(関連する部分のみ抜粋)。
upload_image_spec.rbrequire 'rails_helper' RSpec.describe '画像のアップロード', type: :system do let(:user) { FactoryBot.create(:user) } before do valid_login(user) end # 画像をアップロードして保存する def upload_user_avatar(user) visit edit_user_path(user) attach_file 'user_avatar', "#{Rails.root}/spec/fixtures/images/test.jpg" click_on '保存する' end it 'userがアップロードした画像がマイページに表示されること' do upload_user_avatar(user) expect(page).to have_selector("img[src$='test.jpg']") end it "userが画像の更新に成功すること" do visit edit_user_path(user) attach_file 'user_avatar', "#{Rails.root}/spec/fixtures/images/updated_test.jpg" click_on '保存する' expect(page).to have_selector("img[src$='updated_test.jpg']") end it "画像をアップロードせずに編集したとき、デフォルトの画像データで上書きされないこと" do upload_user_avatar(user) visit edit_user_path(user) click_on '保存する' expect(page).to have_selector("img[src$='test.jpg']") end end最後まで読んでいただきありがとうございます!
日々学んだことをアウトプットしてます!ご指摘などあれば是非ともコメントいただけますと嬉しいです!!
- 投稿日:2020-10-14T23:20:59+09:00
【AWS S3】AWS Access Key Id you provided does not exist in our records エラー【Rails AWS EC2】
エラー内容
本番環境(EC2)で画像投稿(carrierwave)をしようとすると、下記のようなエラーが起きる。
表示されている(読み込まれている)AWSAccessKeyIdは以前使用していた古いキー。
エラー文から古いアクセスキーが読み込まれているため整合性が取れず起きたエラーと判断した。エラーに対するTRY
- .bash_profileの更新
- .envファイルの確認
- .awsディレクトリ以下の確認(config,credentials)
- aws configure の確認
- AWS IAMによりポリシー等の確認
.bash_profileでexportしていたアクセスキーIDが確かに古いものであった。
それを新しいアクセスキーに更新し、.envファイルやIAM、aws configure listを確認し、最新のアクセスキーIDに更新されたことを確認したが、画像を投稿すると同じエラーが生じる。Dockerを利用しているため、古いイメージなどを消去するも、変化なし。ローカル$ aws configure list AWS Access Key ID [None]: AKIA...(新しいアクセスキー) AWS Secret Access Key [None]: KEY...(新しいアクセスキー) Default region name: ーーー Default output format: json解決方法
途方に暮れていたところ、
「EC2で不具合が起きた時はまずEC2インスタンスを再起動させよ」という先人の言葉をふと思い出した。
「あぁ、これが正解だ」と思った。恐らく、EC2インスタンスを再起動させないと上手く読み込まれない。EC2インスタンスからexitでログアウトし、再ログイン(ssh)ではダメだった。
EC2インスタンスを再起動させると予想通り解決し、正常に画像を投稿できた。
学び
AWS CLIにより、ターミナルから古いキーを新しいキーに変更した場合は必ずEC2インスタンスを再起動させる!
AWSアクセスキーID等は最新なのに私と同じようなエラーが起きるという方はまずは使用しているEC2インスタンスを再起動させてみてください。
- 投稿日:2020-10-14T23:08:29+09:00
【Ruby on Rails】キャッシュを使い、初回アクセス時に一度だけ表示(jquery.cookie.js使用)
目標
※新しくブラウザを立ち上げるか、
1日(設定で変更出来ます)経った後に表示させるようにします。開発環境
ruby 2.5.7
Rails 5.2.4.3
OS: macOS Catalina流れ
1 gemの導入
2 jQuery本体とjquery.cookie.jsの読み込み
3 viewの編集gemの導入
Railsでjqueryを使えるようにします。
Gemfilegem 'jquery-rails'ターミナル$ bundle insatllapp/assets/javascripts/application.js//= require jquery ←追加 //= require jquery_ujs ←追加 //= require activestorage //= require turbolinks //= require_tree .jquery.cookie.jsの読み込み
head部分に下記を追加し、jquery.cookie.jsの読み込みます。
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.min.js"></script>
app/views/layouts/application.html.erb<head> <%= csrf_meta_tags %> <%= csp_meta_tag %> <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.min.js"></script> ←追加 </head>viewの編集
今回はhtmlで完結させています。
app/views/homes/top.html.erb<div class="indication"> <div class="box"> <p>下記の表示終了ボタンを押すと、<br>更新しても見ることは出来ません。<br> 新しいブラウザを立ち上げると表示されます。 </p> <button>表示終了</button> </div> </div> <style> .indication{ position: fixed; top: 0; left: 0; width: 100%; height: 100vh; background: rgba(0,0,0,0.5); z-index: 1; } .box{ position:absolute; top:40%; left:35%; width:400px; height:150px; background-color: #ffffff; z-index:2; } .box p{ padding:15px; } .box button{ display:block; margin:0 auto; } </style> <script> $(function(){ $(".indication").show(); if($.cookie('Flg') == 'on'){ $(".indication").hide(); }else{ $(".indication").show(); } $(".box button").click(function(){ $(".indication").fadeOut(); $.cookie('Flg', 'on', { expires: 1,path: '/' }); }); }); </script>考え方
if($.cookie('Flg') == 'on')
にて
on
の記述がなければindicationクラスを表示しています。また、ボタンがクリックされると、indicationクラスを表示させず、
$.cookie('Flg', 'on'
の記述で
cookieに’on’の値を入れ、
{ expires: 1,path: '/' });
の記述で
キャッシュの保存期間を1日、対象範囲は”/”でサイト全体を指定しています。
※保存期間の指定はこちらのサイトを参考にしてください。
jquery.cookie.jsの使い方とCOOKIEの寿命(保存期間)を秒・分・時間で指定する方法まとめ
使用頻度はそこまで高くないかもしれませんが、
注意しないといけないサイトや、登録をさせたいサイト等には有効だと思います。またtwitterではQiitaにはアップしていない技術や考え方もアップしていますので、
よければフォローして頂けると嬉しいです。
詳しくはこちら https://twitter.com/japwork
- 投稿日:2020-10-14T22:58:44+09:00
form_withのフォーム部品の属性
初めて記事を書きます。
スクール学習中にform_withについて学習した事をここに記録します。
- 使用環境
- Rails 6.0.0
- Ruby 2.6.5
form_withとは
form_withメソッドとは、、、
フォームを実装するためのヘルパーメソッドです。
ヘルパーメソッドとは、、、
railsにおいて主にビューでHTMLタグを出現させたり、テキストを加工するためのメソッドの総称。
HTMLでも同様の機能を果たす事ができますが、ヘルパーメソッドを使う利点があります。
1.パスの指定やRubyの埋め込みなどの記述がシンプルになるため
2.セキュリティ上の問題を解消するため
ヘルパーメソッドで書けるのであれば優先的にそうしましょう。form_withのフォーム部品
<h1>新規投稿ページ</h1> <%= form_with url: "/posts", method: :post, local: true do |form| %> <%= form.text_field :content %> <%= form.submit '投稿する' %> <% end %>該当部分、、、
<%= form.text_field :content %>
<%= form.submit '投稿する' %>form_withのフォーム部品の属性
上記該当部分に属性を追加する事ができる。
属性として指定できるのは
.1 name属性
.2 value属性
.3 id属性<%= f.text_area :tag_name, name:'item', value:@item.tags[0].tag_name, id:"tag-name" %>.1 name属性
nameで定義されている文字列がHTTPリクエストで送信するパラメーターのkeyとなります。そしてフォーム欄に記入した文字列がvalueとして格納されて送信されます。パラメーターの中身が複数になってしまった時などにはここを指定する事で1つのパラメーターに揃える事ができます。.2 value属性
初期値を指定できます。元々その値を入力しておく事ができます。.3 id属性
JavaScliptで指定する。そして、上記で紹介した属性を記述しなくても、実際にHTMLファイル内ではじめに紹介した属性指定なしのコードを記入するだけで、実は裏では自動でinput要素に置き換えられ、細かな設定をしてくれています。
それを確認するにはコードを打ってから、ブラウザの検証ツールを開いて確認してみてください。
ですので、あくまで指定しないといけない状況の場合指定すればいいと思います。
また、form_withの中身を見るには、createもしくはupdateアクション直下でbindin.pryを記入して中身を確認してください。
- 投稿日:2020-10-14T22:10:54+09:00
[rails]navbarやヘッダーをTOPページのみ非表示にする
概要
railsでオリジナルアプリ製作中に躓いた出来事。
下記の赤い枠
で囲まれた部分を、部分テンプレートとして呼び出していました。
※↑ユーザー登録画面、作成中なので見づらいです。。トップページは以下のような構成で、ヘッダーを呼び出したくないので、どうしようかと考えてました。
※↑オリジナルアプリのTopページ部分テンプレートの呼び出し方
トップページ以外には全てヘッダーを表示させたいので
application.html.erb
で部分テンプレートをレンダーしています。application.html.erb<!DOCTYPE html> <html> <head>~省略~</head> <body> <%= render "shared/header" %> <%# ここでヘッダーを呼び出している。 <%= yield %> <%= render "shared/footer" %> </body> </html>current_page?で場合分けしてみた
こちらの記事を参考に現在のページがtopページ
(root_path)
でない場合は、部分テンプレートを呼び出さないようにしてみた。application.html.erb<body> <% unless current_page?(root_path) %> <%# unlessで現在のページがrootなら呼び出さない <%= render "shared/header" %> <% end %> <%= yield %> <%= render "shared/footer" %> </body>まとめ
部分テンプレートを呼び出すページを指定する時に、コントローラーに記載したり
JavaScriptで呼び出すページを発火させたり、様々な手段がありそうですが
自分の場合は1ページのみ非表示なのでこのやり方が良いかなと思いました。もしこの記載方法が推奨されてない理由などありましたら、ご指摘いただければと思います。
- 投稿日:2020-10-14T21:58:30+09:00
Ruby 文字列の n 文字目と n + 1 文字目
はじめに
学習用のメモになるます。
例題
文字列 s が入力されるので、n 文字目と n + 1 文字目を出力してください。 n + 1 文字目がない場合は何も出力しない
入力例1 2 read出力例1 e aソースコード
n = gets.chomp.to_i str = gets.chomp puts "#{str[n - 1]} #{str[n]}" if str[n]解説
n = gets.chomp.to_i str = gets.chomp・nに何番目の文字列なのか読み取る
・strで文字列の指定puts "#{str[n - 1]} #{str[n]}" if str[n]・この文でstrのn番目の文字とn+1の文字を呼び出している
・if文でstr[n]を記述することで一番初めの文字や最後の文字を呼び出したら出力しないようにしている
*数字が0から始まってしまうので-1で調整している最後に
if文の説明がわかりづらいかもしれません。
間違っているところがありましたらご指摘いただけるとありがたいです。
- 投稿日:2020-10-14T21:29:11+09:00
[ Ruby ]クラスインスタンス変数などの基礎知識
はじめに
ここでは、rubyのクラス変数やインスタンス変数、アクセサなどの
基礎となる部分を書いていきます。クラス変数
そのクラス自身、サブクラスや
クラスメソッド、インスタンスメソッドから参照することができる変数です。定義の仕方は頭に
@@
を付けます。class SuperKlass @@super_klass_var = :super_klass_val end class Klass < SuperKlass @@class_var = :class_val def self.class_method puts "class_method called" puts @@super_klass_var puts @@class_var end def instance_method puts "instance_method called" puts @@super_klass_var puts @@class_var end end klass_instance = Klass.new Klass.class_method # => class_method called # => super_klass_val # => class_val klass_instance.instance_method # => instance_method called # => super_klass_val # => class_valインスタンス変数
インスタンス変数に値を保持することで、オブジェクト固有の状態を保持できるようするものです。
なお、インスタンス変数はオブジェクトの外部からは直接アクセスすることが出来ないため、
アクセスするためにattr_accessor
メソッドを使用する必要があります。class Famiry attr_accessor :name end father = Famiry.new father.name # => nil father.name = "Namihey" father.name # => Namiheyattr_accessorを使用しない場合はNoMethodErrorとなります。
class Famiry end father = Famiry.new father.name = "Namihey" # => undefined method `name=' for #<Famiry:0x00007f8a97908bd8> (NoMethodError)なお、インスタンスメソッド内で頭に
@
を付けるて定義すると、インスタンス変数になります。class Geinin def initialize(val) @val = val end def tukkomi puts @val end end east = Geinin.new("なんでだよ") east.tukkomi north = Geinin.new("なんでやねん") north.tukkomiattr_accessor
インスタンス変数に対して、
参照
、代入
を許可するメソッドです。
代入は拒否し参照のみを許可する場合はattr_reader
参照は拒否し代入のみを許可する場合はattr_writer
などを使い分けます。
このようなメソッドをアクセサ
と呼びます。なお、上記のメソッドを使用することで以下のメソッドが定義されます。
# 参照メソッド def name @name end # 代入メソッド def name=(val) @name = val endクラスインスタンス変数
クラスはClassクラスのオブジェクトであるため、クラスオブジェクト自体に
インスタンス変数を持たせることができます。selfがクラスを指すコンテキストで、上記のインスタンス変数と同じように
頭に@
をつけて定義するとクラスインスタンス変数となります。なお、参照できるのも
self
がクラスを指すコンテキスト内となります。class klass # 定義 @class_instance_val = :class_instance_val def self.class_method # 参照 @class_instance_val end endクラス変数とクラスインスタンス変数の違い
クラス変数とクラスインスタンス変数が、同じように感じるかもしれませんが
クラスインスタンス変数は、クラスオブジェクトのインスタンス変数であるため
そのクラスで定義されたインスタンスメソッド内では、参照することができません。また、クラス変数はそのクラスを継承したクラスから参照、変更できますが
クラスインスタンス変数はできません。
まとめると、以下の2点が違いです。
- インスタンスメソッドから参照
- クラス変数・・・できる
- クラスインスタンス変数・・・できない
- 継承したクラスから参照、変更
- クラス変数・・・できる
- クラスインスタンス変数・・・できない
おわり
- 投稿日:2020-10-14T21:09:15+09:00
[Ruby]クラスメソッド、インスタンスメソッドなど
はじめに
前回は、クラスの継承やネストなどの記事を書きましたが、
今回はクラスメソッドなどの基礎知識を書いていきます。メソッド
クラスメソッド
その名の通り、クラスオブジェクトが呼び出せるメソッドです。
インスタンスオブジェクトでは呼ぶことが出来ません。
そのため、よく対比されるものとして、インスタンスメソッド
がありますが
これについては後述します。定義の仕方として以下の方法があります。
メソッドを定義する際にメソッド名の前に self. を付ける
メソッド内で自身のクラスをレシーバとする際は、
クラス名
やself
を
省略することが出来ますが、定義の際のself
は省略できません。class Klass def self.method_a new puts "created Klass instance" end end Klass.method_a # => created Klass instanceclass << self, end で囲む
この間に定義されたものは、全てクラスメソッドとなるため
複数定義する際に便利です。class Klass class << self def method_a new puts "created Klass instance" end end end Klass.method_a # => created Klass instanceちなみに、これに近い形でこのようにも出来ます。
class Klass end class << Klass def method_a new puts "created Klass instance" end end Klass.method_a # => created Klass instanceインスタンスメソッド
インスタンスオブジェクトが呼び出せるメソッドです。
こちらは、先ほどのクラスメソッドとは対象に
クラスオブジェクトからは呼び出すことができません。定義の方法は以下です。
class Klass def method_a puts "method_a called" end def method_b method_a puts "method_b called" end end klass_instance = Klass.new klass_instance.method_b # => method_a called # => method_b called特異メソッド
オブジェクト固有のメソッドのことです。
定義するメソッド名の前に、オブジェクト名を書くことで定義できます。
なお、定義する際に、そのオブジェクトが既に存在していないといけません。class Klass end apple = Klass.new orenge = Klass.new def apple.tokui_method puts "I'm apple" end apple.tokui_method # => I'm apple orenge.tokui_method # => undefined method `tokui_method'もしも定義する際にその指定するオブジェクトが存在していなかった場合、エラーとなります。
class Klass end def apple.tokui_method puts "I'm apple" end apple = Klass.new apple.tokui_method # => undefined local variable or method `apple' for main:Object (NameError)特異メソッド内で
super
を呼ぶと、クラスに定義されている同名のメソッドが呼ばれます。
また、そのメソッドのオーバーライドが出来るという便利な点もあります。class Klass def my_name puts "I'm fruits" end end apple = Klass.new orenge = Klass.new def apple.my_name super puts "I'm apple" end apple.my_name # => I'm fruits # => I'm apple orenge.my_name # => I'm fruitsおわり
- 投稿日:2020-10-14T21:09:15+09:00
[ Ruby ]クラスメソッド、インスタンスメソッドなど
はじめに
前回は、クラスの継承やネストなどの記事を書きましたが、
今回はクラスメソッドなどの基礎知識を書いていきます。メソッド
クラスメソッド
その名の通り、クラスオブジェクトが呼び出せるメソッドです。
インスタンスオブジェクトでは呼ぶことが出来ません。
そのため、よく対比されるものとして、インスタンスメソッド
がありますが
これについては後述します。定義の仕方として以下の方法があります。
メソッドを定義する際にメソッド名の前に self. を付ける
メソッド内で自身のクラスをレシーバとする際は、
クラス名
やself
を
省略することが出来ますが、定義の際のself
は省略できません。class Klass def self.method_a new puts "created Klass instance" end end Klass.method_a # => created Klass instanceclass << self, end で囲む
この間に定義されたものは、全てクラスメソッドとなるため
複数定義する際に便利です。class Klass class << self def method_a new puts "created Klass instance" end end end Klass.method_a # => created Klass instanceちなみに、これに近い形でこのようにも出来ます。
class Klass end class << Klass def method_a new puts "created Klass instance" end end Klass.method_a # => created Klass instanceインスタンスメソッド
インスタンスオブジェクトが呼び出せるメソッドです。
こちらは、先ほどのクラスメソッドとは対象に
クラスオブジェクトからは呼び出すことができません。定義の方法は以下です。
class Klass def method_a puts "method_a called" end def method_b method_a puts "method_b called" end end klass_instance = Klass.new klass_instance.method_b # => method_a called # => method_b called特異メソッド
オブジェクト固有のメソッドのことです。
定義するメソッド名の前に、オブジェクト名を書くことで定義できます。
なお、定義する際に、そのオブジェクトが既に存在していないといけません。class Klass end apple = Klass.new orenge = Klass.new def apple.tokui_method puts "I'm apple" end apple.tokui_method # => I'm apple orenge.tokui_method # => undefined method `tokui_method'もしも定義する際にその指定するオブジェクトが存在していなかった場合、エラーとなります。
class Klass end def apple.tokui_method puts "I'm apple" end apple = Klass.new apple.tokui_method # => undefined local variable or method `apple' for main:Object (NameError)特異メソッド内で
super
を呼ぶと、クラスに定義されている同名のメソッドが呼ばれます。
また、そのメソッドのオーバーライドが出来るという便利な点もあります。class Klass def my_name puts "I'm fruits" end end apple = Klass.new orenge = Klass.new def apple.my_name super puts "I'm apple" end apple.my_name # => I'm fruits # => I'm apple orenge.my_name # => I'm fruitsおわり
- 投稿日:2020-10-14T20:59:33+09:00
Ruby length,size,count使い方
はじめに
学習用のメモになります。
rubyでは配列の要素数を取得するためにlengthメソッド、またはsizeメソッドを使用します。また、条件を指定して配列の要素を取り出すにはcountメソッドを使用すると便利です。
この記事では、基本的な使い方を学習していきます。
lengthメソッド
配列に入っている要素の数を知りたい場合は「lengthメソッド」か「sizeメソッド」を使用しますが、lengthにはarrayクラスとstringクラスの二種類があります。
arrayクラスのlengthメソッドは配列に対して使用し、配列の要素数を返します。
また、strignクラスのlengthメソッドは文字列が入っている変数に対して使用すると文字の数を返します。
array = ["red","blue","yellow"] str = "エンジニア" p array.length p str.length[実行結果]
3 6sizeメソッド
sizeメソッドはlengthメソッドとまったく同じ結果を返します。
array = ["red","blue","yellow"] str = "エンジニア" p array.size p str.size[実行結果]
3 6countメソッド
配列の要素を条件付きで数えたい場合はcountメソッドを使用します。
引数に条件を指定することで条件に合った要素の数だけを取得できます。
“red”の要素数が知りたい場合、
array = ["red","blue","yellow","red","green"] p array.count("red")[実行結果]
2他にも引数にブロックを渡すことで少し複雑な条件を指定することもできます。
要素を2で割った余りが0の数、つまり偶数の数を数えてみましょう。
array = [1,2,2,2,3,3,4,5,] p array.count{ |num| num % 2 == 0}[実行結果]
4また、引数を指定しないでcountメソッドを使用した場合はlengthやsizeと同じように要素数を返します。
countでnil(空の要素)を除いた要素数を数える方法
配列にnilが入っていた場合、nilをカウントしたくない!という時にはcountメソッドに条件を指定します。
array = ["red","blue",nil,"yellow"] p array.count{ |num| !num.nil? }[実行結果]
3最後に
今回は length,size,countメソッドの使い方について学習しました。
もし間違っているところがあればご指摘いただけると幸いです。
- 投稿日:2020-10-14T20:26:53+09:00
最初にどのプログラミング言語を学ぶか悩まなくて良い3つの理由
はじめに
プログラミング学習を始めたばかりの方はきっと どのプログラミング言語を学習するか 非常に悩まれると思います。
「求人が多いし Ruby?
それともRubyはオワコンだから PHP ?
それとも人工知能に興味があるから Python?」
みたいなやつです。私も悩んだ経験があるので気持ちはよく分かるのです。
しかし Web系エンジニアとして働き始めて約半年、当時の自分が悩んでいた意味はほとんど無かったかなと思います。なので今回は私の考える 最初にどのプログラミング言語を学ぶか悩まなくて良い3つの理由 についてまとめてみたいと思います?♂️
1. 1つできれば他もできる
これはよく耳にするのでは無いでしょうか?
私も学習を始めた時、このことをよく言われていましたが、全然信用していませんでした。。。「だって「言語」ですよ、そんな訳ないじゃん!どれを勉強するのかはよく考えないといけないはず」という具合。
しかし断言できますが、これは本当です?最初はどの言語を学習しても大変です。プログラミングそれ自体に慣れていないのですから分からないことだらけで当然です。
これは Ruby を学習したから、PHPを学習したから楽になるという話では無いのです。配列、ハッシュ、文字列、数字、クラス。。。
もちろん全部ではありませんが、各言語で共通している概念というのは非常に多いのです。
「方言」が違うようなイメージです。最近になって改めて体系的に JavaScript を学習しました。
最初にRubyを学習した時の苦労を 10 だとすると、JSの学習に関しての苦労は 1ぐらい です。どの道1つの言語では対応できません。複数の言語を学ぶことになります。
なのでまずは1つの言語をしっかり学習してみてはいかがでしょうか?2. 何があっている(楽しいと感じる)かなんて分からない
時間をかけて考えれば自分にぴったりの言語が見つかるというのも個人的にはちょっと違うかなと思っています。
そもそもプログラミングに限らず、何でもやってみないと分からないというのは多くのことに共通しています。そしてプログラミングをこれから学習しようとする人にはそもそも 「判断材料」がありません 。
これは仕方の無いことです。本当に右も左も分からない状態ですし、頼る情報があるとするならばポジショントークまみれで不安を煽るような情報源ばかり。
判断する材料が頭に入っていないのに悩んでいては時間ばかり過ぎていくかもしれません。迷うより、まずやってみれば良いんです。
勉強するのにお金はかかりませんし、大きなリスクにもなりません。
楽しく無いなら止めれば良いだけです。3. 悩めば悩むほどポジショントークに振り回される
2番でも少し書きましたが、悩んでいる初学者にとって注意が必要なのがこのポジショントークです。
世間一般に見られる現象ですが、この業界に入ってからは特にポジショントークが溢れかえっていることに気付かされます。悩めば悩むほど、様々なポジショントークに触れることでどんどん振り回されます。
結果、学習をそもそも始める前から疲れてしまったりするのです。さらに恐ろしいことに、学習を始める前段階では ポジショントークであることにすら気付かない のです。
ただ単にメンタルが振り回されて消耗するだけです。私は最初にRubyを学習していたとき、ネットの情報源で「Rubyはオワコンだから学習しても無駄」という声を散々聞いて無駄に不安になっていました。
しかし今となっては「何してたんだろう」という感じです。。。ポジショントークに振り回されないコツは、「早く自分で行動する」ということです。
こうすることでしか自分で判断することはできません。とは言っても、どうしたら良いの?
きっと私も含めて多くの人が「損をしたくない」と思っているのでしょう。
一生懸命時間をかけて勉強したのが無駄になったら嫌だ、と。でも途中で言語を変えたとして、それは「無駄」なのでしょうか?
少なくとも最初に学習した言語が自分に合わなかったという「発見」は得られるはずです。
これはあなたが感じたことなのでどのサイトにも載っていない、非常に価値のある発見です。まずは一歩を踏み出すことが大前提です!!
それでも迷う方は、初学者に王道の
- Ruby
- PHP
- JavaScript
あたりから始めてみてはいかがでしょうか?
好きなのをやるのが1番ですが、難易度の振れ幅が無いわけではありません。学習したことは無いですが、初めての学習で C言語とかやると心が折れやすいというのはよく聞く話なので、その辺を参考にしてみるのも良いかもしれません!
ごちゃごちゃ言いましたが、プログラミングは楽しいものです!!
一歩を踏み出して挑戦する未来のエンジニアさんにとってこの記事が少しでも役に立てたら嬉しいです。
- 投稿日:2020-10-14T19:25:40+09:00
[Rails]enumの使い方
はじめに
アプリ開発でActive Hashではなくenumを使ってみたので軽くまとめてみました。
目次
1.テーブルの設定
2.モデルの設定
3.ビューファイルの設定1. テーブルの設定
今回はgenderというカラムにenumを使っていきます。
enumを使う際はカラム型をinteger型にする必要があります。
カラム名 カラム型 gender integer 2. モデルの設定
モデルファイルにデータを記述します。
enumは以下のようなハッシュの形で定義します。例
enum gender: { man: 0, woman: 1, other: 2 }3. ビューファイルの設定
今回はラジオボタンとして表示しました。
第一引数にカラム名、第二引数にモデルで定義した値を記述します。<div class="field"> <%= f.label :man %> <%= f.radio_button :gender, :man %> <%= f.label :woman %> <%= f.radio_button :gender, :woman %> <%= f.label :other %> <%= f.radio_button :gender, :other %> </div>manが選ばれたときのデータベースへの保存の流れ
ビューでmanをキーとして送信→コントローラー→モデルで送られてきたキーを元に番号を探す→データベースに数値で保存
参考リンク
- 投稿日:2020-10-14T18:32:55+09:00
rails test dbのみdrop
- 投稿日:2020-10-14T18:00:12+09:00
Ruby 指定範囲だけ大文字
はじめに
これは学習のメモになります。
スペース区切りの2つの整数と、文字列が入力されます。2つの整数の範囲の部分文字列を、大文字に出力していきます。
入力例1 2 6 this is a pen 出力例1 tHIS Is a pen入力例2 2 6 Welcome to the paiza! I`m studying ruby! 出力例2 WELCOMe to the paiza! I`m studying ruby!ソースコード
nums = gets.chomp.split(' ') str = gets.chomp (1..(str.size)).each do |i| if nums[0].to_i <= i && i <= nums[1].to_i print str[i - 1].upcase else print str[i - 1] end end解説
nums = gets.chomp.split(' ') str = gets.chompgetsメソッド: 入力を一行ごとに「文字列」で受け取る。
chompメソッド: 文字列の改行を取り除く。
splitメソッド: 文字列を分解して配列にする。(1..(str.size)).each do |i|1から
size
メソッドでstr
の文字列をi変数に代入して1つずつ繰り返す。(13回)if nums[0].to_i <= i && i <= nums[1].to_i print str[i - 1].upcase else print str[i - 1] endif文でnums[0](例1だと2)よりもi(配列番号)が大きいかつ、nums[1](例1だと6)よりもi
(配列番号)が少ない場合、upcase
で大文字に変換する。そうでなければそのまま出力。
最後に
ちょっと説明がわかりづらいかもしれません。
間違っているところがあればご指摘いただけると幸いです。
- 投稿日:2020-10-14T17:17:59+09:00
「英数6文字以内」「全角のみ使用可能」「空欄ではエラーになる」というバリデーションをかけた
結論
以下を利用した。
with_options
条件付きバリデーションをグループ化できる。do endで囲って使用する。
presence: true
空でないことを確認する。
format:
withオプションに記述した正規表現が送られた値とマッチしているか検証する。
/\A[ぁ-んァ-ン一-龥]+\z/
Unicodeにおける範囲でひらがな、カタカナ、漢字と一致しているか調べる。
/[a-z\d]{6,}/i
大文字小文字可能で、英字もしくは数字6文字以上であるか確認する。
{6,20}とすれば6文字以上20字いないと指定できる。message
ここにエラーの時に出るメッセージを記述する。
コード
models/user.rbwith_options presence: true, format: { with: /\A[ぁ-んァ-ン一-龥]+\z/, message: 'に全角文字を使用してください' } do validates :family_name validates :first_name end validates :password, format: { with: /[a-z\d]{6,}/i, message: "は6文字以上の英数字が使えます" } end参考文献
Railsガイドのformatヘルパーの欄をご覧ください。
https://railsguides.jp/active_record_validations.html
基本的な正規表現一覧
https://murashun.jp/blog/20190215-01.html
- 投稿日:2020-10-14T17:06:15+09:00
マルチスケールシミュレーション特論まとめ
マルチスケールシミュレーション特論の講義内容などのまとめサイトです。
概要
メニュー
・Commandまとめ
・Assert&rubular
・rake
・Rubyのif,case
・Rubyの変数とMethod
・Rubyの入出力最終課題
Google Recruit
Roman Numerals
- source ~/grad_members_20f/members/wjswnsrud12/README.org
- 投稿日:2020-10-14T16:56:02+09:00
パスの種類
パス
パスとはディレクトリやファイルの場所を示す文字列のことです。
ディレクトリは階層ごとに/(スラッシュ)で区切ります。パスの指定方法は、
絶対パス と 相対パス の2つがあります。FinderなどのGUIとパスで示すことの違いは、
地図を元に場所を指差すのか、その場所の住所を伝えるのか、という違いと似ていますね。次は、 絶対パス と 相対パス について説明します。
絶対パス
絶対パスは ルートディレクトリから指定するパス です。
Macの全ディレクトリにおけるルートディレクトリは /(スラッシュ)です。
全てのディレクトリやファイルはここから辿っていきます。
そのため、絶対パスで指定するときにはパスの一番最初に/(スラッシュ)を指定します。例:絶対パス/Users/ユーザ名/Desktopここで、一番始めの/(スラッシュ)はルートディレクトリを指し、2番目以降の/は階層の区切りを表している点を混同しないように注意して下さい。
また、/Users/ユーザ名はホームディレクトリであり、~と表すことができるため、ホームディレクトリより下層にあるディレクトリのパスは以下のような絶対パスで示すこともできます。
例:絶対パス~/Desktop絶対パスは、どのディレクトリで作業していても指定した場所に移動できます。しかし、パスをルートディレクトリからたどって指定する必要があるため、記述が長くなってしまう場合もあります。
相対パス
相対パスは カレントディレクトリから指定するパス です。
ルートディレクトリから指定しないため、パスの始めに/(スラッシュ)をつけてはいけません。カレントディレクトリ直下のディレクトリやファイルであれば、どのようなディレクトリ階層にあるのか指定することなく簡単にパスの指定ができます。
相対パス# カレントディレクトリがホームディレクトリの場合にデスクトップの場所を指定する Desktop # カレントディレクトリがホームディレクトリの場合にデスクトップにあるファイルの場所を指定する Desktop/メモ.txt相対パスは、記述をシンプルにパスの指定が可能となるメリットがあります。しかし、カレントディレクトリがどこにあるのかによって、指定するパスを変更する必要があります。
これらのパスは、階層を示す方法として必要な知識ですが、ターミナルでは
パスのみだと何も処理を命令することができません。
パスはPCへの命令と合わせることで使用します。まとめ
絶対パスは、ルートディレクトリから指定するパスのこと。
相対パスは 、カレントディレクトリから指定するパスのこと。例えるなら、誰かに道案内をするときに「東京都〇〇区△△市...」と直接住所を伝えるのが絶対パス。相手の居る現在地から考え「そこからまっすぐ進んで2つ先の角を左に...」のように伝えるのが相対パスであるといえます。
以上。
- 投稿日:2020-10-14T16:41:34+09:00
親要素に紐づく子要素を同時に削除する方法
Railsにおいてreviewモデルの削除機能に関して、元々は問題なく機能しておりましたが、commentモデル実装後にエラーが発生しました。
原因解明したので共有いたします。開発環境
Rails 6.0.3.3
devise 4.7.3問題発生時の実装内容
reveiwを親、commentを子としてルーティングをネストしております。
config/routes.rbresources :reviews do resources :comments, only: [:create, :destroy] endreviewが削除されるように実装しておりました。
comment実装前はこのまま削除ができました。views/reviews/show.html.erb<%= link_to review_path(id: @review.id), method: :delete do %> <div>レビュー削除</div> <div>こちらからレビューの削除ができます。</div> <% end %>修正箇所
commentをreviewの子要素として実装したため、review削除時に同時にcommentも削除されるよう実装しなければなりません。
そのため、models/review.rbを以下のように修正します。models/review.rbhas_many :comments↓↓↓
models/review.rbhas_many :comments, dependent: :destroyこちらで削除機能実装完了です。
参考
- 投稿日:2020-10-14T16:11:06+09:00
taiseiyoのREADME.org
qiita_links
以下のリンクから qiita の好きな記事に飛べます!!
授業編
- taiseiyo の README
- 第 2回目の授業
- 第 5 回目の授業
- 第 7 回目の授業
- 第 8 回目の授業
- 第 9 回目の授業
- 第 10 回目の授業
- 第 11 回目の授業
- 第 12 回目の授業
- roman numerals
- google recruit
番外編
- source ~/Downloads/git/grad_members_20f/members/taiseiyo/README.org
- 投稿日:2020-10-14T16:10:54+09:00
README(マルチスケールシミュレーション)
授業
本記事(link先記事も含む)はマルチスケールシミュレーション特論講義に関する記事です
qiita_links
- README.org
- WEEK_5:Rubyの第1歩(Ruby入出力編)
- WEEK_6:Rubyの第2歩(変数とmethod編)
- WEEK_7:Rubyの第3歩(条件文と配列編)
- WEEK_8:Rubyの第4歩(Rake編)
- WEEK_9:Rubyの第5歩(Assert編)
- WEEK_10:Rubyの第6歩(Recursion編)
- WEEK_11:Rubyの第7歩(Class編)
最終課題
- source ~/grad_members_20f/members/Rooter-edi/README.org
- 投稿日:2020-10-14T16:01:20+09:00
【Rails】ImageMagick(RMajick)を導入する方法
ImageMajickとは
ImageMagick(イメージマジック)は画像を操作したり表示したりするためのソフトウェア。
GIF、JPEG、PNG、PDF、TIFFなど100種類以上の画像ファイルフォーマットに対応しており、プログラム上からの画像の変換・編集などに必要な多数の機能を備えている。
「画像のアップロード → サムネイル生成 」など、画像を加工・変形するWEBサービスを組みたい場合に使う。導入
諸々の画像処理をするため、ImageMajickを使いたい。
ただこれはRubyのものではなく、
RubyだとRMagick
というgemで使えるようになるらしいのでこちらを入れる。# 追加 gem 'rmagick' # => bundle installただ、以下のようなエラーが起きる。
Gem::Ext::BuildError: ERROR: Failed to build gem native extension. current directory: /Users/uenoyuuki/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/rmagick-4.0.0/ext/RMagick /Users/uenoyuuki/.rbenv/versions/2.5.0/bin/ruby -r ./siteconf20190916-2480-i0d2pg.rb extconf.rb checking for brew... yes checking for clang... yes checking for pkg-config... yes ERROR: Can't install RMagick 4.0.0. Can't find ImageMagick with pkg-config *** extconf.rb failed *** Could not create Makefile due to some reason, probably lack of necessary libraries and/or headers. Check the mkmf.log file for more details. You may need configuration options. Provided configuration options: --with-opt-dir --without-opt-dir --with-opt-include --without-opt-include=${opt-dir}/include --with-opt-lib --without-opt-lib=${opt-dir}/lib --with-make-prog --without-make-prog --srcdir=. --curdir --ruby=/Users/uenoyuuki/.rbenv/versions/2.5.0/bin/$(RUBY_BASE_NAME) To see why this extension failed to compile, please check the mkmf.log which can be found here: /Users/uenoyuuki/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/extensions/x86_64-darwin-18/2.5.0-static/rmagick-4.0.0/mkmf.log extconf failed, exit code 1 Gem files will remain installed in /Users/uenoyuuki/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/rmagick-4.0.0 for inspection. Results logged to /Users/uenoyuuki/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/extensions/x86_64-darwin-18/2.5.0-static/rmagick-4.0.0/gem_make.out An error occurred while installing rmagick (4.0.0), and Bundler cannot continue. Make sure that `gem install rmagick -v '4.0.0' --source 'https://rubygems.org/'` succeeds before bundling.先にImagaMajick自体のインストールが必要らしい。
OSが
Amazon-Linux
なので、yum
を使ってインストールする。$ sudo yum -y install ImageMagick ImageMagick-devel# 再度追加 gem 'rmagick' # => bundle install成功…!
失敗談
ImageMagickを入れるまでの失敗として、
今までパッケージマネージャをノリで使っていたため、
それぞれの違いをわかっておらず、変に時間がかかった。# Amazon-Linuxでは使えない # Mac OS $ brew install imagemagick@6 # Ubunts $ sudo apt-get install imagemagick libmagick++-devなんのOSか分からない!なんてことはないはずだが、
最悪これでもOSを確認できる。$ cat /etc/*-release参考
Active StorageのVariantの指定方法いろいろ
RailsでRMagickを使う
[Gem] RMagick をCentOSでインストール
Cloud9でrmagickを使おうとしたらエラーって解決した話
aptコマンドのインストールができない
- 投稿日:2020-10-14T15:52:12+09:00
README.org
本ページは大学講義における個人メモです
emacs-htmlize memo
C-c, C-e, hoでorgファイルをHTML化
しかし、htmlizeないから入れろと怒られた。
以下で対応。
https://qiita.com/daddygongon/items/298e3e351bf15cfaa699
equation<2020-10-28 Wed>
$$\frac{1}{4}$$
qiita_links
- README.org
- No.5 Hello, World(print)
- No.6 variable, method
- No.7 if, array, each
- No.8 rake
- No.9 assert_equal
- No.10 フィボナッチ数列、リファクタリング
- No.11 class
- No.12 thor
Google Recruit, roman numerals
issues
pull requests
- source ~/grad_members_20f/members/createiveIKEP/README.org
- 投稿日:2020-10-14T15:51:57+09:00
README.org
qiita_links
- README.org
- マルチスケールシミュレーション特論:第7回
- マルチスケールシミュレーション特論:第8回(assert)
- マルチスケールシミュレーション特論:第10回(Recursive)
- マルチスケールシミュレーション特論:第11回(class)
- Google Recruit
- roman numerals
- source ~/grad_members_20f/members/ryuta-kikuchi/README.org
- 投稿日:2020-10-14T15:51:00+09:00
マルチシミュレーション特論まとめ
自分用メモ(残課題など)
htmlに出力 <2020-11-11 Wed>
htmlizeのインストールが必要らしい(どうやって?今は時間がないので後日調べましょう)
メニュー
- README.org
- 第5回(未更新)
- 第6回(未更新)
- 第7回(未更新)
- 第8回(未更新)
Tips
qiitaに黒背景でコードを乗せたい
#+begin_src ruby puts "Hello World." #+ end_src #本来+の後のスペースは不要qiitaに記事をアップロードしたい
> qiita post hogehoge.orggitにアップロードしたい
> git pull origin main > git add -A > git commit -m 'コメント' > git push origin mainこれで最低限アップロードできる。git commitのコメントはなくても良いらしい(あった方が後から見たとき分かりやすいだろうが…)
参考にした記事
- source ~/MasahiroOba/grad_members_20f/members/MasahiroOba/README.org
- 投稿日:2020-10-14T15:48:13+09:00
Rubyのキーワード引数についてメモる
- 投稿日:2020-10-14T15:38:27+09:00
Library not loaded: /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib (LoadError) の対応
rubocopが使えない
rubocopを使おうとしたらopenssl のエラーが発生したので誰かの助けになればと思い記事を書いておきます。
$RBENV_VERSION=2.2.10 rubocop hoge_controller.rb >Library not loaded: /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib (LoadError)どうやらopensslのエラーみたいで、先日
brew update
したらopensslが1.1にupdateされた感じです。
自分のRubyのバージョンだと1.1は使えないので上記のエラーが発生したみたいです。解決方法
下記のコマンドでバージョンを切り替えることで解決することができました。
brew switch openssl 1.0.2t以上です。
- 投稿日:2020-10-14T15:20:50+09:00
deviseを使ったログインユーザーと未ログインユーザーの遷移分け
何をしたいか
ログインをした後に見せたいホーム画面的なものをroot_pathに設定していたので
ログインしていないユーザーはアプリの紹介ページに飛ぶように設定をします記述
このページに書いてある通りdeviseを使ったものになります。
まだdeviseを入れてない方は入れてからこのページに戻ってきてください。
さて本題に入ります
まずコントローラーの記述を変えます。photos_controller.rbclass PhotosController < ApplicationController before_action :move_to_index #ここを追加で記述 def index end #ここから下を追加で記述 private def move_to_index unless user_signed_in? redirect_to controller: :homes, action: :index end end end何をしているか上から解説します
before_action :move_to_index
before_actionはコントローラーの全てのアクションが実行される前に何らかの処理を行う時に使用するものです
そのbefore_actionにmove_to_indexというメソッドを指定しています。
メソッドなのでここは皆さんで記述が違います
じゃぁそのメソッドはどこで定義してあるの??それは後ほど解説します。private
クラス外から呼び出すことのできないメソッドのことです。
Rubyでは、privateと記述した以下のコードがプライベートメソッドになります。
僕の解釈はこのコントローラー内でしか使用できないメソッドと解釈しています。違ったらすみません…def move_to_index
ここでmove_to_indexを定義しています。
先ほどのbefore_action :move_to_indexに繋がるわけです
ではそのmove_to_indexではどのようなことをしているのか見てきますunless user_signed_in?
user_signed_in?はdeviseを入れることで使えるヘルパーメソッドです
ユーザーがログイン済みかどうか判断します
そこにunless 〜がないならのような意味です
この単語がくると、ログインしていなければ〜で次の行に進みますredirect_to controller: :homes, action: :index
少し文が長いので
redirect_toにまず注目ですこれは、指定したURLに遷移させることができるメソッドです
なのでcontroller.rbredirect_to "http://www.○○○○.com"でもできるし
controller.rbredirect_to root_pathのようにPrefix名も指定できます
controller.rbredirect_to controller: :homes, action: :index最後に指定したコントローラーのアクションを指定することもできます
他にもまだできるので是非検索してみてください
これで流れとしては
indexが読み込まれる前にbefore_actionで先にmobe_to_indexメソッドを読みます。その中にはユーザーがログインしていなければ、ここに遷移すると設定ができました。ルーティング
コントローラーにて
redirect_to controller: :homes, action: :indexと最後記述しているの
homesコントローラーのindexアクションが呼ばれますroutes.rbget '/homes/home', to:'homes#index'を記述します
/homes/homeはURL名の指定です
こんな感じになっています。
そしてhomes#index
homesコントローラーのindexアクションを指定します
これで終わりです
- 投稿日:2020-10-14T15:13:14+09:00
Raisアクションコントローラーにおけるnewとcreateの違い
初投稿です。
復習でnewとcreateの違いがごちゃごちゃになったときがあったので
備忘録として投稿させて頂きます。コントローラーアクションnewとcreateの違い
どちらも作成という意味です。
ですが大きな違いは2つあります。1つ目は
idを与えるかどうか
newアクションにはIDを与えません。
また、newアクション専用のページに遷移する事が多いです。
例えばTweetの新規投稿、メルカリなら出品ページとして理解するのが良いと思います。逆にcreateアクションにはその投稿に対してIDを与える
例えばTweetで投稿したらその時の投稿者や投稿した時間などが記載されていると思います。
これは投稿した瞬間にIDが与えられモデルからDBに保存される様になっています。
ここから、編集したり削除する事もできますがこれらはIDがあるからこそできるのです。アクションコントローラーの基本的な使い方 newアクション def new @tweet = Tweet.new end createアクション def create Tweet.create(tweet_params) end2つ目は
HTTPメソッドが違う
。
ターミナルでrake routes(rails routesでも可)で確認したら出てきます。createアクション tweets POST /tweets(.:format) tweets#create newアクション new_tweet GET /tweets/new(.:format) tweets#newHTTPメソッドは4種類あります。以下を参照して下さい。
HTTPメソッド どのような時に用いられるリクエストか GET ページを表示する操作のみを行う時 POST データを登録する操作をする時 PUT データを変更する操作をする時 DELETE データを削除する操作を行う時以上となります。
- 投稿日:2020-10-14T13:30:02+09:00
Ruby 繰り返し処理
はじめに
これは学習用のメモになります。
今回は様々な繰り返し文についてまとめていきたいと思います。for文
「for」文ではあらかじめ指定したオブジェクトから順に値を取り出しながら繰り返しを行います。
for カウンタ変数 in 繰り返す範囲 do # doは省略可能 繰り返し処理 end例)HTMLで1歳から10歳までのプルダウンリスト puts "<select name='age'>" for age in 1..10 puts "<option>#{age}歳</option" end puts "</select>"while文
条件式が真である限り、処理を繰り返します。
# whileによるループ処理 # カウンタ変数を初期化 while 条件式 do # doは省略可能 #繰り返し処理 #カウンタ変数を更新 end例) i=1 while i <=10 //1から10を繰り返す puts i #繰り返し処理 i=i+1 #カウンタ変数を更新 endif文(条件分岐)
if 条件式 条件式が成り立ったときの処理 else 条件式が成立しなかったときの処理 endnumber = 1 if number == 1 puts "数字は1です" else puts "数字は1ではありません" end[実行結果]
数字は1です複数の条件式
if 条件式 条件式が成り立ったときの処理 elsif 条件式2 条件式2が成立したときの処理 else 条件式がどれも成立しなかったときの処理 endeach文
each分とは配列の要素を順番に取り出して処理を行うことができる
配列.each do |変数名| #実行したい処理 endnames = ["Masato","Okachan","Saitou"] names.each do |name| puts "名前は#{name}です" end[実行結果]
名前はMasatoです 名前はOkachanです 名前はSaitouです最後に
間違っている部分があるかもしれないですがその時はご指摘いただけると幸いです。
- 投稿日:2020-10-14T13:05:06+09:00
gretelを用いたパンくず機能の実装方法
What: パンくず機能とは
パンくず機能とはウェブページの上部でよく見かけるこの表示のことです!!
Why: なぜパンくず機能を実装するのか
パンくず機能とはウェブページにおいてユーザーが現在どのページにいるかを視覚的に確認しやすくするための機能です。
How: どうやって実装するのか
step 1: gemfileの導入
ここでは'gem gretel'をgemfileに追加し、bundle installを実行しましょう。
gem 'gretel'$ bundle installstep 2: 設定ファイルの作成
bundle installが完了したらrails generate gretel:installを実行しましょう。
すると、configディレクトリにbreadcrumbs.rbが生成されます。
これが設定ファイルになります。$ rails generate gretel:installstep 3: 設定ファイルの記述
生成されたbreadcrumbs.rbに記述していきます。
今回はアイテム変数を用いて階層構造になっているカテゴリの親、子、孫要素をそれぞえ取得して表示させたいと思います。
ここで一点注意なのですが、ビューで引数に@item変数を引き渡すことに加えて、子要素以降のcrumbのparentに変数itemを追記しないとエラーが発生します!
(原因はわからず、、教えていただけると幸いです!)crumb :root do link 'FreeMa', root_path end crumb :parent_category do |item| link item.category.parent.parent.name, root_path parent :root end crumb :child_category do |item| link item.category.parent.name, root_path parent :parent_category, item end crumb :grandchild_category do |item| link item.category.name, root_path parent :child_category, item end crumb :current_product do |item| link item.name parent :grandchild_category, item endstep 4: ビューの記述
- breadcrumb :parent_category, @item - breadcrumb :child_category, @item, class: 'content' - breadcrumb :grandchild_category, @item, class: 'content' - breadcrumb :current_product, @item, class: 'current' = breadcrumbs separator: " › "step 5: ビューの調整
cssで見た目を整えれば、、、
完成!!
かなり説明を省いてしまいましたが
公式ドキュメントに詳しい説明がありますので、是非一読を!
【参考記事】
パンくずリストの実装
【Rails】gretelを使ってパンくずリストを作成
一番わかりやすいパンくずの実装(gem 'gretel')