20201014のRubyに関する記事は30件です。

【Rails】画像をアップロードせずに編集するとデフォルトの画像で上書きされてしまう問題の解決方法【ActiveStorage】

現在、個人開発中のアプリがかなり完成に近づきつつある中、新たに新しいバグを見つけてしまいました、、(リリース前に気付いてよかった)

前置き長いんで、さっさと解決策知りたい方はこの辺飛ばしちゃってください!!

プロフィール画像などの画像のアップロード機能をActiveStorageを使い実装したのですが、以下のようなバグが見つかりました。
例えば、あるユーザーがユーザー編集ページで画像の設定をしたとします。そして、次にパスワードを変更したくなったとします。当然、ユーザーは新しいパスワードのみ入力し、その値が編集ページのフォームからポストされます。
このとき、フォームのファイル選択エリア(file_field)には前回アップロードした画像は設定されていないので、この状態でupdateアクションが実行されてしまうと前回アップロードした画像が消えてしまい、アプリで設定しているデフォルトの画像で上書きされてしまうのです。

つまり、このままでは編集をするたびに毎回画像をアップロードしないと画像の変更を維持できないという最悪のUXをユーザーに提供してしまいます。これはなんとかしなければいけませんね、、というわけで解決策を書きます!

解決策(超簡単)

コントローラーに以下を追記します。

users_controller.rb
def 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
  end

if @user.avatar.blank?を追記するだけです!
実は、ググってもググってもActiveStorageですでに設定された画像のキャッシュを作成するやり方がわからなかったので、自分で考えて色々と仮説検証した結果この一文を編み出し、解決することができました。(CarrierWaveなら出てきた)
テストもパスすることを確認しました。(この一文を消すとちゃんとテストに失敗することも確認済)

しかし、これだと

既に設定されている画像を普通に変更する場合、@user.avatar.bkank?がfalseになって@user.avatar.attach(params[:avatar])が実行されずに画像の変更ができないんじゃないか?

と思いませんか?僕は思います。。wでも、実際画像は更新されるし、テストもパスするのでとりあえずこれで良しとしようと思います。

どなたかこのあたりの原理が分かる方、もしよければコメントいただけますと幸いです。

テストコード

補足として実際にパスしたテストコードをここに掲載します(関連する部分のみ抜粋)。

upload_image_spec.rb
require '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

最後まで読んでいただきありがとうございます!

日々学んだことをアウトプットしてます!ご指摘などあれば是非ともコメントいただけますと嬉しいです!!

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

【AWS S3】AWS Access Key Id you provided does not exist in our records エラー【Rails AWS EC2】

エラー内容

本番環境(EC2)で画像投稿(carrierwave)をしようとすると、下記のようなエラーが起きる。
スクリーンショット 2020-10-14 1.02.13.png

表示されている(読み込まれている)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インスタンスを再起動させてみてください。

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

【Ruby on Rails】キャッシュを使い、初回アクセス時に一度だけ表示(jquery.cookie.js使用)

目標

表示.gif

※新しくブラウザを立ち上げるか、
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を使えるようにします。

Gemfile
gem 'jquery-rails'
ターミナル
$ bundle insatll
app/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

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

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を記入して中身を確認してください。

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

[rails]navbarやヘッダーをTOPページのみ非表示にする

概要

railsでオリジナルアプリ製作中に躓いた出来事。
下記の赤い枠で囲まれた部分を、部分テンプレートとして呼び出していました。
スクリーンショット 2020-10-14 21.51.51.png
※↑ユーザー登録画面、作成中なので見づらいです。。

トップページは以下のような構成で、ヘッダーを呼び出したくないので、どうしようかと考えてました。
スクリーンショット 2020-10-14 21.47.49.png
※↑オリジナルアプリの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ページのみ非表示なのでこのやり方が良いかなと思いました。

もしこの記載方法が推奨されてない理由などありましたら、ご指摘いただければと思います。

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

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文の説明がわかりづらいかもしれません。
間違っているところがありましたらご指摘いただけるとありがたいです。

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

[ 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
# => Namihey

attr_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.tukkomi

attr_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点が違いです。

  • インスタンスメソッドから参照
    • クラス変数・・・できる
    • クラスインスタンス変数・・・できない
  • 継承したクラスから参照、変更
    • クラス変数・・・できる
    • クラスインスタンス変数・・・できない

おわり

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

[Ruby]クラスメソッド、インスタンスメソッドなど

はじめに

前回は、クラスの継承やネストなどの記事を書きましたが、
今回はクラスメソッドなどの基礎知識を書いていきます。

メソッド

クラスメソッド

その名の通り、クラスオブジェクトが呼び出せるメソッドです。

インスタンスオブジェクトでは呼ぶことが出来ません。
そのため、よく対比されるものとして、インスタンスメソッドがありますが
これについては後述します。

定義の仕方として以下の方法があります。

メソッドを定義する際にメソッド名の前に self. を付ける

メソッド内で自身のクラスをレシーバとする際は、クラス名self
省略することが出来ますが、定義の際のselfは省略できません。

class Klass
  def self.method_a
    new
    puts "created Klass instance"
  end
end

Klass.method_a
# => created Klass instance
class << 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

おわり

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

[ Ruby ]クラスメソッド、インスタンスメソッドなど

はじめに

前回は、クラスの継承やネストなどの記事を書きましたが、
今回はクラスメソッドなどの基礎知識を書いていきます。

メソッド

クラスメソッド

その名の通り、クラスオブジェクトが呼び出せるメソッドです。

インスタンスオブジェクトでは呼ぶことが出来ません。
そのため、よく対比されるものとして、インスタンスメソッドがありますが
これについては後述します。

定義の仕方として以下の方法があります。

メソッドを定義する際にメソッド名の前に self. を付ける

メソッド内で自身のクラスをレシーバとする際は、クラス名self
省略することが出来ますが、定義の際のselfは省略できません。

class Klass
  def self.method_a
    new
    puts "created Klass instance"
  end
end

Klass.method_a
# => created Klass instance
class << 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

おわり

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

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
6

sizeメソッド

sizeメソッドはlengthメソッドとまったく同じ結果を返します。

array  = ["red","blue","yellow"]
str = "エンジニア"

p array.size
p str.size

[実行結果]

3
6

countメソッド

配列の要素を条件付きで数えたい場合は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メソッドの使い方について学習しました。
もし間違っているところがあればご指摘いただけると幸いです。

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

最初にどのプログラミング言語を学ぶか悩まなくて良い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言語とかやると心が折れやすいというのはよく聞く話なので、その辺を参考にしてみるのも良いかもしれません!


ごちゃごちゃ言いましたが、プログラミングは楽しいものです!!

一歩を踏み出して挑戦する未来のエンジニアさんにとってこの記事が少しでも役に立てたら嬉しいです。

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

[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をキーとして送信→コントローラー→モデルで送られてきたキーを元に番号を探す→データベースに数値で保存

参考リンク

https://madogiwa0124.hatenablog.com/entry/2017/12/24/222156

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

rails test dbのみdrop

circle ciとローカル環境でテスト結果が異なるので、念のためtest用のdbをdropしてからmigrateしてみました

rake db:drop RAILS_ENV=test
rake db:create RAILS_ENV=test
rake db:schema:load RAILS_ENV=test

参考記事

Rails 4: How to reset test database?

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

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.chomp

getsメソッド: 入力を一行ごとに「文字列」で受け取る。
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]
  end

if文でnums[0](例1だと2)よりもi(配列番号)が大きいかつ、nums[1](例1だと6)よりもi
(配列番号)が少ない場合、upcaseで大文字に変換する。

そうでなければそのまま出力。

最後に

ちょっと説明がわかりづらいかもしれません。
間違っているところがあればご指摘いただけると幸いです。

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

「英数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.rb
  with_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

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

マルチスケールシミュレーション特論まとめ

Mac OS X-10.15.7 ruby-2.7.1p83

マルチスケールシミュレーション特論の講義内容などのまとめサイトです。

概要

  1. README.orgの雛形

メニュー

Commandまとめ
Assert&rubular
rake
Rubyのif,case
Rubyの変数とMethod
Rubyの入出力

最終課題

Google Recruit

google recruit

Roman Numerals

roman numerals


  • source ~/grad_members_20f/members/wjswnsrud12/README.org
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

パスの種類

パス

パスとはディレクトリやファイルの場所を示す文字列のことです。
ディレクトリは階層ごとに/(スラッシュ)で区切ります。パスの指定方法は、
絶対パス相対パス の2つがあります。

パス.png

FinderなどのGUIとパスで示すことの違いは、
地図を元に場所を指差すのか、その場所の住所を伝えるのか、という違いと似ていますね。

次は、 絶対パス相対パス について説明します。

絶対パス

絶対パスは ルートディレクトリから指定するパス です。
Macの全ディレクトリにおけるルートディレクトリは /(スラッシュ)です。
全てのディレクトリやファイルはここから辿っていきます。
そのため、絶対パスで指定するときにはパスの一番最初に/(スラッシュ)を指定します。

例:絶対パス
/Users/ユーザ名/Desktop

ここで、一番始めの/(スラッシュ)はルートディレクトリを指し、2番目以降の/は階層の区切りを表している点を混同しないように注意して下さい。

また、/Users/ユーザ名はホームディレクトリであり、~と表すことができるため、ホームディレクトリより下層にあるディレクトリのパスは以下のような絶対パスで示すこともできます。

例:絶対パス
~/Desktop

絶対.png

絶対パスは、どのディレクトリで作業していても指定した場所に移動できます。しかし、パスをルートディレクトリからたどって指定する必要があるため、記述が長くなってしまう場合もあります。

相対パス

相対パスは カレントディレクトリから指定するパス です。
ルートディレクトリから指定しないため、パスの始めに/(スラッシュ)をつけてはいけません。

カレントディレクトリ直下のディレクトリやファイルであれば、どのようなディレクトリ階層にあるのか指定することなく簡単にパスの指定ができます。

相対パス
# カレントディレクトリがホームディレクトリの場合にデスクトップの場所を指定する
Desktop

# カレントディレクトリがホームディレクトリの場合にデスクトップにあるファイルの場所を指定する
Desktop/メモ.txt

相対.png

相対パスは、記述をシンプルにパスの指定が可能となるメリットがあります。しかし、カレントディレクトリがどこにあるのかによって、指定するパスを変更する必要があります。

これらのパスは、階層を示す方法として必要な知識ですが、ターミナルでは
パスのみだと何も処理を命令することができません。
パスはPCへの命令と合わせることで使用します。

まとめ

絶対パスは、ルートディレクトリから指定するパスのこと。
相対パスは 、カレントディレクトリから指定するパスのこと。

例えるなら、誰かに道案内をするときに「東京都〇〇区△△市...」と直接住所を伝えるのが絶対パス。相手の居る現在地から考え「そこからまっすぐ進んで2つ先の角を左に...」のように伝えるのが相対パスであるといえます。

以上。

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

親要素に紐づく子要素を同時に削除する方法

Railsにおいてreviewモデルの削除機能に関して、元々は問題なく機能しておりましたが、commentモデル実装後にエラーが発生しました。
原因解明したので共有いたします。

開発環境

Rails 6.0.3.3
devise 4.7.3

問題発生時の実装内容

reveiwを親、commentを子としてルーティングをネストしております。

config/routes.rb
resources :reviews do
    resources :comments, only: [:create, :destroy] 
end

reviewが削除されるように実装しておりました。
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.rb
has_many :comments

↓↓↓

models/review.rb
has_many :comments, dependent: :destroy

こちらで削除機能実装完了です。

参考

https://qiita.com/Tsh-43879562/items/fbc968453a7063776637

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

taiseiyoのREADME.org

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

README(マルチスケールシミュレーション)

Mac OS X-10.15.7 ruby-2.7.1p83

授業

本記事(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編)

最終課題

  • Final 1:最終課題(RomanNumerals編)
  • Final 2:最終課題(GoogleRecruit編)

  • source ~/grad_members_20f/members/Rooter-edi/README.org
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】ImageMagick(RMajick)を導入する方法

ImageMajickとは

ImageMagick(イメージマジック)は画像を操作したり表示したりするためのソフトウェア。
GIF、JPEG、PNG、PDF、TIFFなど100種類以上の画像ファイルフォーマットに対応しており、プログラム上からの画像の変換・編集などに必要な多数の機能を備えている。
「画像のアップロード → サムネイル生成 」など、画像を加工・変形するWEBサービスを組みたい場合に使う。

Imagemagickの使い方日本語マニュアル

導入

諸々の画像処理をするため、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コマンドのインストールができない

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

README.org

Mac OS X-10.15.7 ruby-2.7.1p83

本ページは大学講義における個人メモです

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

Google Recruit, roman numerals

issues

pull requests


  • source ~/grad_members_20f/members/createiveIKEP/README.org
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

README.org

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

マルチシミュレーション特論まとめ

Mac OS X-10.15.7 ruby-2.7.1p83

自分用メモ(残課題など)

htmlに出力 <2020-11-11 Wed>

htmlizeのインストールが必要らしい(どうやって?今は時間がないので後日調べましょう)

メニュー

  1. README.org
  2. 第5回(未更新)
  3. 第6回(未更新)
  4. 第7回(未更新)
  5. 第8回(未更新)

Tips

qiitaに黒背景でコードを乗せたい

#+begin_src ruby
puts "Hello World."
#+ end_src            #本来+の後のスペースは不要

qiitaに記事をアップロードしたい

> qiita post hogehoge.org

gitにアップロードしたい

> 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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rubyのキーワード引数についてメモる

基本

image.png

  • 呼び出し側は、指定されたキーワードのシンボルをkeyとするハッシュを引数に与える
  • 複数のキーワードを指定することも可能

デフォルト値も設定できる

def b(test:, test2: 't2')
   puts test1, test2
end
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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

以上です。

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

deviseを使ったログインユーザーと未ログインユーザーの遷移分け

何をしたいか

ログインをした後に見せたいホーム画面的なものをroot_pathに設定していたので
ログインしていないユーザーはアプリの紹介ページに飛ぶように設定をします

記述

このページに書いてある通りdeviseを使ったものになります。
まだdeviseを入れてない方は入れてからこのページに戻ってきてください。
さて本題に入ります
まずコントローラーの記述を変えます。

photos_controller.rb
class 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.rb
redirect_to "http://www.○○○○.com"

でもできるし

controller.rb
redirect_to root_path

のようにPrefix名も指定できます

controller.rb
redirect_to controller: :homes, action: :index

最後に指定したコントローラーのアクションを指定することもできます

他にもまだできるので是非検索してみてください

これで流れとしては
indexが読み込まれる前にbefore_actionで先にmobe_to_indexメソッドを読みます。その中にはユーザーがログインしていなければ、ここに遷移すると設定ができました。

ルーティング

コントローラーにて

redirect_to controller: :homes, action: :index

と最後記述しているの
homesコントローラーのindexアクションが呼ばれます

routes.rb
get '/homes/home', to:'homes#index'

を記述します
/homes/homeはURL名の指定です
スクリーンショット 2020-10-14 15.13.00.png
こんな感じになっています。
そしてhomes#index
homesコントローラーのindexアクションを指定します
これで終わりです

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

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)
  end

2つ目はHTTPメソッドが違う
ターミナルでrake routes(rails routesでも可)で確認したら出てきます。

createアクション
tweets POST   /tweets(.:format)                                                                        tweets#create

newアクション
new_tweet GET    /tweets/new(.:format)                                                                    tweets#new

HTTPメソッドは4種類あります。以下を参照して下さい。

HTTPメソッド どのような時に用いられるリクエストか

GET     ページを表示する操作のみを行う時
POST    データを登録する操作をする時
PUT     データを変更する操作をする時
DELETE  データを削除する操作を行う時

以上となります。

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

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            #カウンタ変数を更新
end

if文(条件分岐)

if 条件式
  条件式が成り立ったときの処理
else
  条件式が成立しなかったときの処理
end
number = 1
if number == 1
  puts "数字は1です"
else
  puts "数字は1ではありません"
end

[実行結果]

数字は1です

複数の条件式

if 条件式
  条件式が成り立ったときの処理
elsif 条件式2
  条件式2が成立したときの処理
else
  条件式がどれも成立しなかったときの処理
end

each文

each分とは配列の要素を順番に取り出して処理を行うことができる

配列.each do |変数名|
  #実行したい処理
end
names = ["Masato","Okachan","Saitou"]

names.each do |name|
  puts "名前は#{name}です"
end

[実行結果]

名前はMasatoです
名前はOkachanです
名前はSaitouです

最後に

間違っている部分があるかもしれないですがその時はご指摘いただけると幸いです。

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

gretelを用いたパンくず機能の実装方法

スクリーンショット 2020-10-14 12.49.19.png

What: パンくず機能とは

パンくず機能とはウェブページの上部でよく見かけるこの表示のことです!!
スクリーンショット 2020-10-14 12.49.19.png

Why: なぜパンくず機能を実装するのか

パンくず機能とはウェブページにおいてユーザーが現在どのページにいるかを視覚的に確認しやすくするための機能です。

How: どうやって実装するのか

step 1: gemfileの導入

ここでは'gem gretel'をgemfileに追加し、bundle installを実行しましょう。

gem 'gretel'
$ bundle install

step 2: 設定ファイルの作成

bundle installが完了したらrails generate gretel:installを実行しましょう。
すると、configディレクトリにbreadcrumbs.rbが生成されます。
これが設定ファイルになります。

$ rails generate gretel:install

step 3: 設定ファイルの記述

生成されたbreadcrumbs.rbに記述していきます。

今回はアイテム変数を用いて階層構造になっているカテゴリの親、子、孫要素をそれぞえ取得して表示させたいと思います。
:warning:ここで一点注意なのですが、ビューで引数に@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
end

step 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: "  &rsaquo;  "

step 5: ビューの調整

cssで見た目を整えれば、、、

完成!!

かなり説明を省いてしまいましたが
公式ドキュメントに詳しい説明がありますので、是非一読を!
【参考記事】
パンくずリストの実装
【Rails】gretelを使ってパンくずリストを作成
一番わかりやすいパンくずの実装(gem 'gretel')

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