20200214のRubyに関する記事は20件です。

rbenvの新環境にgemをインストールしようとしてもパスがシステムのもののままになっている場合の対処法

対処法

以下のコマンドで解決.おそらくターミナルの再起動でも解決すると思われる.公式ドキュメントに書いていなかったので一応メモ.

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

fish3.1.0でpyenvの初期化失敗の対処方法

tl;dr

~/.config/fish/config.fish のpyenv(rbenv)の行を以下の用に変更すると問題が起きなくなります。

before

. (pyenv init - | psub)
. (rbenv init - | psub)

after

source (pyenv init - | psub)
source (rbenv init - | psub)

発生する問題

fish3.0.2までは . コマンドを使うことができたのですが、どうやら fish3.1.0から使うことができなくなったようです。
これは元から予告されていたこと ではありますが、

. (a single period) is an alias for the source command. The use of . is deprecated in favour of source, and . will be removed in a future version of fish.

ついになくなってしまったんですね(泣)

bash系のコマンドを使っていたり、 . コマンドをなんとなく使っていたという方はこれを機に設定ファイルを見直す必要があります。

pyenv(rbenv)の初期化の構文でも . コマンドを使うことが一般的ですが、fish3.1.0で動かすと以下のようにエラーメッセージが発生してしまいます。

source: Error encountered while sourcing file '/var/folders/yv/0npp741974sgp79671hf_48c0000gn/T//.psub.pxGqFIeIaF':
source: No such file or directory
source: Error encountered while sourcing file '/var/folders/yv/0npp741974sgp79671hf_48c0000gn/T//.psub.VyHOD74WrY':
source: No such file or directory

終わりに

このようなエラーが出たら冒頭で紹介した通り、 source コマンドを使うようにすれば問題なく動くようになります。
僕も今朝この問題に悩まされたので、他に困っている方がいたら参考にしてください〜〜

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

RubyでS3内の5GB以上のファイルをコピーする

S3で5GB以上のファイルをコピーするには、普通のコピーでは出来ずMultipart Copyを使う必要があります。
RailsサーバからS3内の5GB以上のファイルを同じS3内にコピーする記事が無かったのでやり方を書きます。

gemのインストール

gem 'aws-sdk'

コピー処理

Aws::S3::Resourceのcopy_toを使用します。
Aws::S3::Clientのcopy_objectだと恐らくMultipart Copyが出来ません。

s3 = Aws::S3::Resource.new(
      region: 'reagion_name',
      access_key_id: 'access_key',
      secret_access_key: 'secret_key',
    )
bucket = s3.bucket('bucket_name')
object = bucket.object("src/file") # コピー元のobject key
object.copy_to(bucket: 'bucket_name', key: "target/file", multipart_copy: true) # コピー先のobject key

参考

https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/Object.html

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

RailsでFontAwesomeの導入〜大きさを変えるまで

はじめに

railsでFontAwesomeを使いたいと思い調べていたところ、
大きさまで変える記事が見当たらなかったため投稿してみました。

実行環境

Ruby : 2.6.3
Rails : 5.2.4
slim : 4.0.1
font-awesome-sass : 5.12.0
上記の環境で実装いたしました。

FontAwesomeの導入

Gemfileに以下を記述

Gemfile
gem 'font-awesome-sass'

gemをインストール

bundle install

/app/assets/stylesheets/application.css

/app/assets/stylesheets/application.scss
に変更する

mv app/assets/stylesheets/application.css app/assets/stylesheets/application.scss

/app/assets/stylesheets/application.scssに以下を記述

application.scss
@import "font-awesome-sprockets";
@import "font-awesome";

上記の順番通りに記述したことで、FontAwesomeが使えるようになった。

実行結果

font-awesome-sassがインストールされたことにより、ヘルパーメソッドが使えるようになりました。
このメソッドを使うことでアイコンを表示させます。

~.html.slim
= link_to "#" do
  = icon 'fab', 'amazon-pay'

これでアイコンが表示されました。
今回使用したアイコン

Qiita使用画像.png

大きさを変更する

上記で用いたヘルパーメソッドを用いることによって好みの大きさに変更することも可能です。

~.html.slim
= link_to "#" do
  = icon 'fab', 'amazon-pay fa-3x'

このメソッドは次のように構成されています。

icon 'スタイル名', 'アイコン名 (大きさ指定)'

大きさの指定をしない場合は、アイコン名のみを記述し、
大きさ指定をする場合は、アイコン名の後にスペースをあけ、'fa-(サイズ)'で好きな大きさに変更することができます。サイズに関しては公式サイトをご覧ください。
Font Awesome

最後に

初めて記事を投稿してみました。
分かりやすい記事になったかは不安ですが、誰かの助けになれば幸いです。

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

Middleman ローカル環境の立ち上げ方 流れ

気をつけること

  • ruby,nodeのバージョンを確認すること。
  • 指定されているversionを合わす。

commandでの流れ

git clone --recursive git@github.com:なんとかなんとか.git
cd なんとか.com
npm run setup
bundle exec middleman build
bundle exec middleman server

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

renderメソッドについて

初めまして、久保雄貴と申します。
今回はrenderメソッドについて自分が知ったことについて書いてみようと思います。
間違っている点や「こういう風に書いたらいいよ」などアドバイスがありましたら、コメントください。

renderメソッドについて

1.   レンダリングとは?

renderメソッドについて記述する前に、レンダリングという言葉について説明します。
レンダリングとは、ビューファイルから最終的にHTMLにコンパイルされたものをブラウザで読み込んで表示させる一連の流れのことを言います。

ビューファイルにはコードが書かれていますが、ただ文字列が並んでいるだけでそのまま表示してもただ文字が表示されるだけです。
しかし各ブラウザが、そのコードを読んでそのコード通りに表示画面を作成して表示してくれているのです。

ここで重要なのは、Ruby on Railsでは、コントローラーでアクションを起動して一連の動作を行った後、コントローラーと同じ名前のビューファイルを自動的にレンダリングしてくれるということです。
こちらで何か指示を書く必要はありません。

createアクションを起動

メソッド内の命令を実行(自分で記述)

create.html.erbをレンダリング(自動でするよう定義されている)

2.  renderメソッドとは?

renderメソッドとは、レンダリングする元のビューファイルを直接指定することができるメソッドです。

さて、復習ですが、Lesson7の作業中に「render」というメソッドを使いましたね。
何をしたかというと、
① 違うファイル(index.html.erb と show.html.erb)に書かれている全く同じコード切り取る。
② 新しく作ったファイルにペーストする。
③ 使いたいファイルの中でrenderメソッドを使って呼び出す。

というものでした。(部分テンプレートの実装)

renderメソッドを使うことで、指定した別のビューファイルを読み込んで実行してくれるわけです。

メリットとしては、同じコードを別のビューファイル(index.html.erb や show.html.erbとも違う)でも使用できることです。

その時の書き方は
<% render partial: "post", locals:{post: post}%> でした。
partial: → 部分テンプレートのファイル名を指定する
locals:  → 部分テンプレートのファイルで使用したい変数を定義する(左側のpost)


しかし、renderメソッドはオプションを使うことでこの他にも使い方があるようです。
その一つが
render action: :アクション名  
です。

例えば、トップページに行って欲しい場合、

render action: :index

と記述します。

どういう時に使うかというと、
上に書いた通りRailsではデフォルトで、コントローラーと同じ名前のビューファイルをレンダリングしてくれるのですが、それをさせずに、こちらで指定した別のビューファイルを指定してレンダリングさせるように設定したい時です。

例えば、投稿フォーム(new.html.erb)のページで「タイトル」と「内容」を書いて、投稿ボタンを押すと、「投稿が完了しました。」と表示する、投稿完了ページ(create.html.erb)が表示されますね。
そうではなくて、トップページを表示したい時に使います。

どこに記述するかというと、コントローラー内のcreateアクションが定義されているところです。

このように記述するとcreateアクション内で、データベースに投稿内容が保存された後にトップページを表示してくれます。

3. 疑問

さて、ピンときている方もいらっしゃるかもしれませんが、私たちは、すでに自動的にレンダリングをさせずに、トップページを表示させる方法を学んでいます。

redirect_toメソッドです。

redirect_to '/' (もしくは root_path)

と記述するとトップページを表示してくれます。


ここで疑問です。

redirect_to    メソッド
render action: メソッド

を使うと、それぞれどのような動き、結果になるのでしょうか。



4. 実験

今回は、以下のようにcreateアクション内に両方を記述して、動きを見てみましょう。

def create
    Post.create(post_params)
    redirect_to root_path
end
def create
    Post.create(post_params)
    render action: :index
end




  • redirect_to メソッドの場合


1. postscontrollerのcreateアクション内に記述


2. 投稿内容を書いて、投稿


3. 無事にトップページに移動しました。



  • render action: メソッドの場合


1. postscontrollerのcreateアクション内に記述


2. 投稿内容を書いて、投稿


3. エラーが起こりました。


内容は、
「eachメソッドを起動しようとしたら、インスタンス変数@postの中身がnilになっていて使えません。」
ということです。

ここで、index.html.erbを見てみましょう。


確かに、@postの中身をeachメソッドを使って内容を表示させてますね。
ではこの@postはどこで定義されているかというと、

def index
 @post = Post.all
end

ここです。
postscontrollerのindexアクション内です。




5.  4.の実験でわかったこと

  • redirect_toメソッド
    ルーティングにリクエストを送り、postsコントローラーのindexアクションを起動させるため、@postの中にデータベースの内容がコピーされる。その後、index.html.erbがレンダリングされる。
    結果として、トップページが表示される。

  • render action: :index
    ルーティングを介さずに直接index.html.erbを指定してレンダリングするため、index.html.erb内の@postの中身がからのままになっている。(@postに渡すインスタンス変数をcreateアクションが持っていない。)
    結果として、エラーが表示される。

6. 結論

render action:メソッドでトップページを表示させることはできるが、トップページの内容が書かれた、ビューファイル(index.html.erb)にインスタンス変数がある場合はそのインスタンス変数をなんとかしてあげないと、エラーが起こる。
何か特別な事情がない限りredirect_toを使った方がいいのかな?と思いました。

何か、特別な恩恵をうける場面があれば教えてもらえると勉強になります。





P.S.
ちなみに、こうすると、トップページを表示できます。

無駄な記述ですね。


ということで、初投稿は以上です。
ありがとうございました。

<参考>

https://pikawaka.com/rails/render#レンダリング(rendering)とは

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

RSpecでFactoryBotから複数のインスタンスをまとめて作成する【create_listを使用】

RSpecテストを書いているときに、複数のインスタンスをまとめて作れる便利メソッドcreate_listをご紹介します。


例えば下記のようにnoteのファクトリが定義されているとします。

factory/notes.rb
FactoryBot.define do
  factory :note do
    title { 'sample-note' }
    description { 'sample-description' }
  end
end

テストでnoteインスタンスを5つ作りたいと思ったとき、下記のように1つずつ作るのは大変です。

spec/system/xxx_spec.rb
RSpec.describe 'yyyy' do
  let(:note1) { create(:note) }
  let(:note2) { create(:note) }
  let(:note3) { create(:note) }
  let(:note4) { create(:note) }
  let(:note5) { create(:note) }
  ...
end

ここで登場するのがcreate_listです。
これを使えば、まとめてnoteインスタンスを作成することが可能です。

spec/system/xxx_spec.rb
RSpec.describe 'yyyy' do
  notes = create_list(:note, 5)
  ...
end

第1引数に元になるファクトリ、第2引数に作成する数を指定します。
notes =の部分は無くても可)

ちなみに属性の一部を上書きして作成することも可能です(下記参照)。

spec/system/xxx_spec.rb
RSpec.describe 'yyyy' do
  notes = create_list(:note, 5, title: 'Hello, World')
  ...
end

以上です。

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

Middlemanでコマンド 打っていたらiTerm2が止まった

$ bundle exec middleman server
== The Middleman is loading

ここまで来て、止まりました。5分くらいこのまんま。
他はサクサク動いていたのに。

Middleman関連ではない時にコマンドを使っていたときもこんなことがあったので、おそらく私の使っているパソコンが遅いからだと思います。

早くパソコン新しいのに買えましょう・・・・・。高いw

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

【Rails】Modelで定義した定数に他クラスやViewからアクセスする方法

表題の通り、定数にアクセスできずに困った人のための記事です。

結論

Model名::定数名とすればOKです。

解説

下記のUserクラスがあるとします。

models/user.rb
class User < ActiveRecord::Base
  MAX_NUMBER = 10
  ...
end

Viewから参照するには、下記のようにします。

views/xxx.html.erb
最大値は#{User::MAX_NUMBER}です。

 
これが下記のようになっていると、

views/xxx.html.erb
最大値は#{MAX_NUMBER}です。

uninitialized constant ActionView::CompiledTemplates::MAX_NUMBER

そんな定数は無いと怒られてしまいます。

以上です!

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

【Rails】Modelで定義した定数にViewからアクセスする方法

表題の通り、定数にアクセスできずに困った人のための記事です。

結論

Model名::定数名とすればOKです。

解説

下記のUserクラスがあるとします。

models/user.rb
class User < ActiveRecord::Base
  MAX_NUMBER = 10
  ...
end

Viewから参照するには、下記のようにします。

views/xxx.html.erb
最大値は#{User::MAX_NUMBER}です。

 
これが下記のようになっていると、

views/xxx.html.erb
最大値は#{MAX_NUMBER}です。

uninitialized constant ActionView::CompiledTemplates::MAX_NUMBER

そんな定数は無いと怒られてしまいます。

以上です!

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

ActiveRecordのトランザクションのネストに気をつけること

  • 確認した環境
    • Ruby 2.5.1
    • Rails 5.2.1
    • MySQL 5.7.27

腕試しに以下のスクリプトを実行した場合、最終行の User.first.name は何が得られるか考えてみてください.

User.first.update!(name: 'Alice')

ActiveRecord::Base.transaction do
  User.first.update!(name: 'Bob')

  ActiveRecord::Base.transaction do
    User.first.update!(name: 'Carol')
    raise ActiveRecord::Rollback
  end
end

User.first.name


正解はここをクリック

User.first.name の結果は Carol になります.
正解しましたか?
正解する人もいると思いますが直感と違うかと思います.









TL;DR

  • 可能ならトランザクションをネストしない設計する
  • トランザクションをネストする設計の際は requires_new: true を使う
    • 付けないと思いのよらないゴミができる可能性がある

検証

分かりやすくするため、SQLをコメントに加えました.

User.first.update!(name: 'Alice')
# BEGIN
# UPDATE `users` SET `name` = 'Alice' WHERE `users`.`id` = 1
# COMMIT

ActiveRecord::Base.transaction do
  # BEGIN

  User.first.update!(name: 'Bob')
  # UPDATE `users` SET `name` = 'Bob' WHERE `users`.`id` = 1

  ActiveRecord::Base.transaction do
    User.first.update!(name: 'Carol')
    # UPDATE `users` SET `name` = 'Carol' WHERE `users`.`id` = 1
    raise ActiveRecord::Rollback
  end
end
# COMMIT

User.first.name # => 'Carol'

requires_new を使った場合

いくつかのRDBにはトランザクションにSAVEPOINTをサポートしているものがあります.
このSAVEPOINTを利用するには requires_new を指定することで有効になり直感に近い挙動をする様になります.

User.first.update!(name: 'Alice')
# BEGIN
# UPDATE `users` SET `name` = 'Alice' WHERE `users`.`id` = 1
# COMMIT

ActiveRecord::Base.transaction do
  # BEGIN

  User.first.update!(name: 'Bob')
  # UPDATE `users` SET `name` = 'Bob' WHERE `users`.`id` = 1

  ActiveRecord::Base.transaction(requires_new: true) do
    # SAVEPOINT active_record_1

    User.first.update!(name: 'Carol')
    # UPDATE `users` SET `name` = 'Carol' WHERE `users`.`id` = 1
    raise ActiveRecord::Rollback
  end
  # ROLLBACK TO SAVEPOINT active_record_1

end
# COMMIT

User.first.name # => 'Carol'
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ルーティングを設定してCSVデータをダウンロードする方法

目的

  • Qiitaの記事に大まかな流れをテンプレート化しておき、作業効率を上げる。
  • 今までの実装では send_data しか使ったことなかったのでメモ

前提条件

  • ruby 2.6.0
  • ruby 5.2.2

手順

  1. routes.rbにCSVダウンロード用のルーティングを設定する
  2. コントローラーに変数を定義、その他諸々を設定
  3. 出力データを作成(アクション名.csv.ruby)
  4. CSVダウンロードボタンを設定したいviewファイルに書く

※コード内容は適当

1. routes.rbにCSVダウンロード用のルーティングを設定する

config/routes.rb
resources :card_infos do
  collection do
    # デフォルト形式をcsvに設定
    get :csv_download, defaults: { format: 'csv' }
  end
end
Helper HTTP Verb Path Controller#Action
csv_download_card_infos_path GET /card_infos/csv_download(.:format) card_infos#csv_download {:format=>"csv"}

2. コントローラーに変数を定義やその他諸々を設定

app/controllers/card_infos_controller.rb
class CardInfosController < ApplicationController
  def csv_download
    @cards = CardInfo.all

    # CSVダウンロードファイルのヘッダーを生成する
    create_csv_file_header("card_info_#{ Time.zone.now.strftime('%Y%m%d') }")
  end
end
共通化メソッド
  # CSVダウンロードファイルのヘッダーを生成する
  def create_csv_file_header(file_name)
    file_name = ERB::Util.url_encode(file_name) if (/MSIE/ =~ request.user_agent) || (/Trident/ =~ request.user_agent)
    headers['Content-Disposition'] = "attachment; filename=\"#{file_name}.csv\""
  end

3. 出力データを作成(アクション名.csv.ruby)

※viewディレクトリ配下に設置する

app/views/card_infos/csv_download.csv.ruby
require 'csv'

columns = %w(
  番号
  会社
  子会社
  カード種類
  カード会社
  管理区分
)

# encoding等のoptionは仕様によって変えてください
CSV.generate(encoding: Encoding::SJIS, row_sep: "\r\n", force_quotes: true) do |csv|
  csv << columns
  @cards.each_with_index do |card, number|
    csv << [
      number + 1,
      card.company.parent_company.company_name,
      card.company.company_name,
      card.card_type.card_type_i18n,
      card.card_type.card_company.card_company_name,
      card.management_type_i18n,
    ]
  end
end

4. CSVダウンロードボタンを設定したいviewファイルに書く

(例)app/views/card_infos/index.html.erb
<%= link_to csv_download_card_infos_path, class: "btn_blue btn_big csv_dl", download:"", style: "padding: 8px 25px; font-family: Arial;" ) do %>
  <i><img src="<%= asset_path 'icon_download.svg' %>" alt="CSVダウンロード"></i>CSVダウンロード
<% end %>

📂🌲変更するファイル

.
├── app
|   ├── controllers
|  |   |  
|  |   └── card_infos_controller.rb ②アクションを設定
|  |
|  |
|  |
|   └── views
|      |  
|      └── card_infos
|           |  
|           └── csv_download.csv.ruby ③出力ファイルを設定
|
|
├── config
|    |  
     └── routes.rb ①ルーティングを設定


④ViewファイルにCSVダウンロードボタンを設置

関連URL

send_dataでの日本語ファイル名文字化け対策(IE11対応)
【簡単3ステップ】RailsでCSV出力する方法

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

ルーティングを設定してCSVデータのダウンロード(出力)を実装する方法

目的

  • Qiitaの記事に大まかな流れをテンプレート化しておき、作業効率を上げる。
  • 今までの実装では send_data しか使ったことなかったのでメモ

前提条件

  • ruby 2.6.0
  • ruby 5.2.2

手順

  1. routes.rbにCSVダウンロード用のルーティングを設定する
  2. コントローラーに変数を定義、その他諸々を設定
  3. 出力データを作成(アクション名.csv.ruby)
  4. CSVダウンロードボタンを設定したいviewファイルに書く

※コード内容は適当

1. routes.rbにCSVダウンロード用のルーティングを設定する

config/routes.rb
resources :card_infos do
  collection do
    # デフォルト形式をcsvに設定
    get :csv_download, defaults: { format: 'csv' }
  end
end
Helper HTTP Verb Path Controller#Action
csv_download_card_infos_path GET /card_infos/csv_download(.:format) card_infos#csv_download {:format=>"csv"}

2. コントローラーに変数を定義やその他諸々を設定

app/controllers/card_infos_controller.rb
class CardInfosController < ApplicationController
  def csv_download
    @cards = CardInfo.all

    # CSVダウンロードファイルのヘッダーを生成する
    create_csv_file_header("card_info_#{ Time.zone.now.strftime('%Y%m%d') }")
  end
end
共通化メソッド
  # CSVダウンロードファイルのヘッダーを生成する
  def create_csv_file_header(file_name)
    file_name = ERB::Util.url_encode(file_name) if (/MSIE/ =~ request.user_agent) || (/Trident/ =~ request.user_agent)
    headers['Content-Disposition'] = "attachment; filename=\"#{file_name}.csv\""
  end

3. 出力データを作成(アクション名.csv.ruby)

※viewディレクトリ配下に設置する

app/views/card_infos/csv_download.csv.ruby
require 'csv'

columns = %w(
  番号
  会社
  子会社
  カード種類
  カード会社
  管理区分
)

# encoding等のoptionは仕様によって変えてください
CSV.generate(encoding: Encoding::SJIS, row_sep: "\r\n", force_quotes: true) do |csv|
  csv << columns
  @cards.each_with_index do |card, number|
    csv << [
      number + 1,
      card.company.parent_company.company_name,
      card.company.company_name,
      card.card_type.card_type_i18n,
      card.card_type.card_company.card_company_name,
      card.management_type_i18n,
    ]
  end
end

4. CSVダウンロードボタンを設定したいviewファイルに書く

(例)app/views/card_infos/index.html.erb
<%= link_to csv_download_card_infos_path, class: "btn_blue btn_big csv_dl", download:"", style: "padding: 8px 25px; font-family: Arial;" ) do %>
  <i><img src="<%= asset_path 'icon_download.svg' %>" alt="CSVダウンロード"></i>CSVダウンロード
<% end %>

📂🌲変更するファイル

.
├── app
|   ├── controllers
|  |   |  
|  |   └── card_infos_controller.rb ②アクションを設定
|  |
|  |
|  |
|   └── views
|      |  
|      └── card_infos
|           |  
|           └── csv_download.csv.ruby ③出力ファイルを設定
|
|
├── config
|    |  
     └── routes.rb ①ルーティングを設定


④ViewファイルにCSVダウンロードボタンを設置

関連URL

send_dataでの日本語ファイル名文字化け対策(IE11対応)
【簡単3ステップ】RailsでCSV出力する方法

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

[Rails] scriptタグ内でRuby/Railsのメソッドを使用する際のescape_javascriptについて

この記事を書くきっかけ

jQueryを書いていると、scriptタグ内でRailsのメソッド(正確にはapplication_helper内のメソッド)を使用したいときがあります。
正しい書き方をしないと正確に呼び出せないため、失敗した書き方と成功した書き方をまとめます。

前提

current_userの属性によってpathを切り替えるメソッドを
def hogehoge_path_forとし、application_helper.rbに定義します。

application_helper.rb
def hogehoge_path_for
  if ...
   hoge_path
  else
   hogehoge_path
  end
end

これをとあるviewのscriptタグ内で呼び出します。
let path = hogehoge_path_forの返り値
としたいです。

失敗例1

あるview
<script>
  let path = <% hogehoge_path_for %>;
</script>

普通はこう考えるはずですが、これだと呼び出せません。

失敗例2

あるview
<script>
  let path = <% hogehoge_path_for %>;
</script>

これも呼び出せません。

失敗例3

escape_javascriptというメソッドを使用します。
なお、これはaliasとしてjの使用が許されています。

あるview
<script>
  let path = <% escape_javascript hogehoge_path_for %>;
</script>

上記は下記と同じです。

あるview
<script>
  let path = <% j hogehoge_path_for %>;
</script>

どちらも失敗します。

失敗例4

=をつけます。

あるview
<script>
  let path = <%= escape_javascript hogehoge_path_for %>;
</script>

上記は下記と同じです。

あるview
<script>
  let path = <%= j hogehoge_path_for %>;
</script>

これもどちらも失敗します。

失敗例5

=を外して、''で囲います。

あるview
<script>
  let path = '<% escape_javascript hogehoge_path_for %>';
</script>

上記は下記と同じです。

あるview
<script>
  let path = '<% j hogehoge_path_for %>';
</script>

これもどちらも失敗します。

成功例

=をつけて''で囲います!

あるview
<script>
  let path = '<%= escape_javascript hogehoge_path_for %>';
</script>

上記は下記と同じです。

あるview
<script>
  let path = '<%= j hogehoge_path_for %>';
</script>


これで無事呼び出すことができました。

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

Ruby コーティング規約について コレクション編 1

はじめに

命名規則編 2 はこちらをクリック願います。
レイアウト編 3 はこちらをクリック願います。過去記事リンクあり。
構文編 2 はこちらをクリック願います。過去記事リンクあり。
Rubyの基礎を学習中の方に向けて記載致します。
私自身これからチーム開発を行う上で大事にしたい。知っておきたいことをOutputします。

① 配列やハッシュを生成する時はリテラル記法を使う。

qiita.rb
# 悪い例
arr = Array.new
hash = Hash.new

# 良い例
arr = []
arr = Array.new(10)
hash = {}
hash = Hash.new(0)

単語(空でなく、スペースを含まない文字列)の配列を生成する時は %wリテラルを使う。

※ 配列の要素が2つ以上の場合に限り。

qiita.rb
# 悪い例
STATES = ['draft', 'open', 'closed']

# 良い例
STATES = %w[draft open closed]

さいごに

毎日更新します。
皆様の復習等にご活用頂けますと幸いです。

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

Ruby初心者の「結局インスタンスメソッドって何ですか?」にエンジニア歴30年のベテランさん超絶わかりやすいアンサー!!!

結論

インスタンスメソッドとは:インスタンスが(に)使えるメソッド(にくっつくメソッド)

助詞に関しては、インスタンスを主語として考えるか目的語として考えるかの違いです。図で表すとこんな感じスクリーンショット 2020-02-14 8.38.18.png

インスタンスはいわゆる勇者。その勇者の剣がメソッド。つまり「勇者の剣」=インスタンスメソッドなわけだ!

僕の誤解を招いた表現その1

インスタンスメソッドとはインスタンスを含む変数である。*間違い

僕の誤解を招いた表現その2

インスタンス変数にくっつくメソッドである *惜しい、変数ではなくインスタンス自身にくっつくのがインスタンスメソッド

そもそもインスタンスって?

インスタンス化

クラス(クラスがわからない人は下に説明あります!)はnewすると初期化(インスタンスを作成する方法は他にもあるが基本はnew)し、実体化することができます。実体化したものをインスタンスと呼びます。

インスタンス変数

インスタンスは自身の中に複数の値を所有することができます。Rubyでは @ で始まる名前がインスタンスが所有する変数、インスタンス変数です。インスタンスが持つというニュアンスが大切。インスタンスを指し示す変数ではないですよ!
スクリーンショット 2020-02-14 8.49.43.png

そもそもクラスってなんぞや?

1と2どちらも同義ですが、自分にわかりやすい方で構いません!

1. 新しい型を作る方法(型ってのは設計図みたいなものですね。)

2. データと処理のまとまりを部品としてわかりやすく定義する方法

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

Rails初心者が知っておきたい基礎知識|gem、Bundler など…

この記事では、《Rails初心者が知っておきたい基礎知識》について、
僕が学習した内容をまとめています。

  • gem とは…?
  • Gemfile とは…?
  • Gemfile.lock とは…?
  • Bundler とは…?

こういった疑問についてまとめています。

※本記事は、自分で学習したことのまとめ用として書いています。
尚、解説で誤った点があれば、スローして頂ければ喜んでキャッチしますのでお願い致します。

gem とは…?

books-918521_1920.jpg

『gem』は・・・

Rubyのライブラリ(パッケージともいいます)です。

『ライブラリ』とは…
プログラムの部品で、便利な機能をひとまとめにしたものです。

ライブラリを利用することで、自分で1からコードを書くことなく機能を実装することができるので、効率的に開発することが可能です。

Rubyのgemには便利なものがたくさんあり、例えば…

  • Rails(Webフレームワーク)
  • Devise(ログイン機能)
  • Kaminari(ページネーション)
  • unicorn(アプリケーションサーバ)
  • Active Admin(管理画面)

などがあります。
gemを使うことでログイン機能やページネーションといった機能も、簡単に実装可能です。

Gemfile とは…?

『Gemfile』は・・・

gemをインストールするための『設計書』のようなもので、基本的にこのGemfileに自分のアプリケーションに必要なgemを記述します。

Gemfile.lock とは…?

『Gemfile.lock』は・・・

gemをインストールした後の『ログ、記録』のようなもので、インストールしたgemの一覧とバージョンが記載されています。

【比較】Gemfile と Gemfile.lock の違い

Gemfile Gemfile.lock
更新方法 手動 自動
更新タイミング コマンド実行前 コマンド実行後
内容 インストールするgem インストールしたgem

【余談】なぜ Gemfile.lock が必要なのか…?

school-1.jpg

gemは、インストールした時期によってバージョンが変わってしまう可能性があるため…
例えば、本番環境と開発環境でインストールされるgemのバージョンが異なってしまう可能性があります。

しかし・・・

Gemfile.lockが使用するgemのバージョンを管理してくれるため、仮にgemがアップデートされても、使用するgemのバージョンは変更させないということが可能になります。

ちなみに・・・

Gemfile.lockを更新したい時は、bundle updateを使います。

Bundler とは…?

『Bundler』は・・・

gemを管理するためのgemで、Bundlerを使用することで…

bundle install
bundle update

などのコマンドが使用できるようになります。

gem同士は関連し合っていることが多いので、実際はGemfileに書いてあるgemの他にも、gemが必要になります。

そこで・・・

Bundlerは、それらも自動でインストールし、Gemfile.lockに記述してくれます。

bundle_movement.png

Bundlerは、特定のRailsアプリケーションに必要なgemパッケージをリストアップし、複数のコンピュータ間で簡単に同期が取れるようにするものです。

例えば・・・

上記の図のように開発者Bさんが、開発者AさんからRailsアプリのソースコードを受け取ったとします。

この時、Bさんはbundle installを実行するだけで、必要なgemをインストールすることができ、簡単に環境を構築できます。

【一覧】 よく使う Bundlerコマンド のオプション

コマンド 概要
bundle init Gemfileを生成
bundle install Gemfileに記述したgemをインストール
bundle update インストール済みのgemのバージョンを更新
bundle list インストール済みのgemを一覧表示する
bundle exec Bundlerでインストールしたgemを使用して、
コマンドを実行

【コマンド】 bundle install とは…?

bundle install

上記を実行すると・・・

Railsは、Gemfile.lockを元にgemのインストールを行います。

この時…

Gemfile.lockに記述されていなくて、且つGemfileに記述されているgem』

がある場合、『該当するgem』と『該当するgemに関連するgem』をインストールした後、Gemfile.lockを更新します。

反対に、Gemfile.lockに記述されていれば・・・

そこに記述されたgemを見て、それがGemfileの内容に矛盾していない限り、Gemfile.lockの内容に従いインストールします。

【コマンド】 bundle update とは…?

bundle update

上記を実行すると・・・

Bundlerは、Gemfileを元にgemのインストールを行い、その後Gemfile.lockを更新します。

【余談】上記2つのコマンドの使い分けを少し解説

camera-coffee-composition-1509428.jpg

bundle updateは・・・

その言葉通り、gemのバージョンを更新する時に使用します。

なぜなら・・・

bundle installコマンドでは、条件に矛盾が生じない限りGemfile.lockに存在するgemに関しては、更新作業を行わないからです。

bundle updateは、本番環境で安易に実行しないように注意しましょう。場合によっては、gemのバージョンにズレが発生し、クラッシュする可能性があります。

ですので・・・

bundle updateは、必ずローカル環境で実行してください。

また、bundle installに関しては・・・

Gemfileに新しくgemを記述した際に使用します。

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

Rubyで固定長ファイルを楽しく扱う

はじめに

ホストコンピュータ(死語?)から吐き出されたような超長い固定長ファイルが好物です。嘘です。
1行が数百バイト以上(2500バイトとかのファイルあるからね!)、数十から数百項目のExcelの定義書をもらったら時に、私がいつもやっているやり方です。

準備

固定長ファイルなので、定義書は神Excelです!
まずはExcelからキーと1カラムの長さの列を取得して、ペアを作ります。

column_def.rb
Column_def =%w[
any_id 10
any_field1 2
cyclic_1 4
cyclic_2 4
cyclic_3 4
]
# キーと列長のペア
Columns = Hash[*Column_def]
# => {"any_id"=>"10","any_field1"=>"2","cyclic_1"=>"4","cyclic_2"=>"4","cyclic_3"=>"4"}

# 一行のサンプル
input_sample = "0123456789xx12345678abcd"

分解

column_def.rb
# unpackが有能なのでunpackのパターンを作る
column_def = Columns.values.map{|c| "a#{c}"}.join
#=> "a10a2a4a4a4"

arr = input_sample.unpack(column_def)
#=> ["0123456789", "xx", "1234", "5678", "abcd"]

この通り綺麗に分解してくれます。String#unpack有能。

構築

column_def.rb
# Columnを再利用して、さらに扱いやすく
any_item = Hash[Columns.keys.zip(arr)]
#=> {"any_id"=>"0123456789","any_field1"=>"xx", "cyclic_1"=>"1234", "cyclic_2"=>"5678", "cyclic_3"=>"abcd"}

zipした2重配列を連想配列にしてくれるHash有能。
これならjsonや欲しい形に変換して使いやすい。ですよね?

column_def.rb
require "json"

any_item.to_json
#=> "{\"any_id\":\"0123456789\",\"any_field1\":\"xx\",\"cyclic_1\":\"1234\",\"cyclic_2\":\"5678\",\"cyclic_3\":\"abcd\"}"

まとめ

このやり方でいろんな固定長ファイルをサクッと片付けてください。(もっといいやり方、教えて・・・)
CSVでも連想配列にするところは使えますよ。(CSVのクラスはよく使い方忘れるので、ただのArray、Hashが好き)
固定長ファイルは正規化されていないことが多いから、group_byも有能である事はまた今度書こうかな。
Ruby有能。String#unpack有能。Hash有能。
・・・本当はPythonで同じことをやりたい・・・けどRuby以外書けないのです。

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

敢えてRubyで学ぶ「ゼロから作るDeep Learning」閑話 Numo::GSLの導入と正規乱数

第4章に正規(ガウス)分布の乱数を生成するコードが有る。

擬似的に正規分布の乱数を最も簡単に作る方法

-0.5~0.5の乱数の12回の平均。

def norm_rand
  random = Random.new()
  result = 0
  12.times do
    result += random.rand(-0.5..0.5)
  end
  result / 12
end

とはいえ、色々面倒だし、これを使って行列を作るのもなんとも不便。
そこで、乱数を生成してくれるライブラリ、Numo::GSLを導入する。

Numo::GSLの導入

基本的にはDockerのRuby上で行っています。
環境構築に関しては、敢えてRubyで学ぶ「ゼロから作るDeep Learning」Docker環境構築編をご確認ください。

# まずは元となるGSLを導入
$ apt install -y gsl-bin
# 次にNumo::GSLのgemを導入
$ gem install numo-gsl

Numo::GSLでの正規乱数の生成

require 'numo/gsl'

# 標準正規分布のrow * colの行列を作る
def randn(row, col)
  r = Numo::GSL::Rng::Rand.new
  r.gaussian(1, col * row).reshape(col, row)
end
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ruby で公開鍵の文字列から public key オブジェクトを作成する方法

概要

公開鍵の文字列から public key オブジェクトを生成する方法について少しはまったので、共有します。

コード

下記のような公開鍵があるときは

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0bXcnrheJ2snfq1wv6Qz 8+TEPDGKHCM0SsrQjxEFpXSEycL2/A+oW1ZGUzCuhz4HH4wkvc4CDJl25johSIUT Vyo4mrFrJ0ab0QAhrWE7gMyWFIfraj9cksPAGyVAiXLCN9Ly2xuoJxFjCAZXw1VO 8i7RTYK8ZP6dhcosiyzdhYt7C/65B5ikmCS4AymXIa83QQanCtjoGiwy4Cf2pLnn 9zXMZEnqQ+wwSoGn32YExmap7GAtjOwHNWU5zpW3dwNMq+zkcln3ICEBwxDpWJhE ZHZPBpPWgN+dQZDR2FiGHJgUFE3EM+CIcwxekrRBP+R3xEUeMFf5z1HeQNK8sjZe RwIDAQAB
-----END PUBLIC KEY-----

「-----BEGIN PUBLIC KEY-----」の後と「-----END PUBLIC KEY-----」の前に改行記号を入れた文字列を作ります。改行記号の前後にスペースがあるとエラーが出ます。

str = 
"-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0bXcnrheJ2snfq1wv6Qz 8+TEPDGKHCM0SsrQjxEFpXSEycL2/A+oW1ZGUzCuhz4HH4wkvc4CDJl25johSIUT Vyo4mrFrJ0ab0QAhrWE7gMyWFIfraj9cksPAGyVAiXLCN9Ly2xuoJxFjCAZXw1VO 8i7RTYK8ZP6dhcosiyzdhYt7C/65B5ikmCS4AymXIa83QQanCtjoGiwy4Cf2pLnn 9zXMZEnqQ+wwSoGn32YExmap7GAtjOwHNWU5zpW3dwNMq+zkcln3ICEBwxDpWJhE ZHZPBpPWgN+dQZDR2FiGHJgUFE3EM+CIcwxekrRBP+R3xEUeMFf5z1HeQNK8sjZe RwIDAQAB\n-----END PUBLIC KEY-----"

その文字列を OpenSSL::PKey::RSA に渡します。

public_key_object = OpenSSL::PKey::RSA.new(str)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む