20210114のRailsに関する記事は17件です。

NoMethodError: undefined method `set_encoding' for

Failures:

  1) Product POST #create ログインしているユーザー productの数が一つ増えていること
     Failure/Error: expect {post products_path, params: product_params }.to change(Product, :count).by(1)

     NoMethodError:
       undefined method `set_encoding' for #<Product:0x0000000007fe4988>

ここからが改善策。まずは直す前

describe 'POST #create' do
??let(:product_params) { FactoryBot.create(:product,title: '新規投稿',user: user) }
    context 'ログインしているユーザー' do
      it 'productの数が一つ増えていること' do
        #ログインする
        sign_in_as(user)
        #POSTで投稿の新規作成,数が一つ増えているかexpect
        expect {post products_path, params: product_params }.to change(Product, :count).by(1)
      end
    end

改善策

describe 'POST #create' do
    #新しいproductを作る
    ??let(:product_params) do 
      { product: {
        title: "四皇",
        language: "PHP",
        detail: "ウオウオの実",
        period: "8年",
        user: user
       }
      }
    end
    context 'ログインしているユーザー' do
      it 'productの数が一つ増えていること' do
        #ログインする
        sign_in_as(user)
        #POSTで投稿の新規作成,数が一つ増えているかexpect
        expect {post products_path, params: product_params }.to change(Product, :count).by(1)
      end
    end
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

# 誤ってrails db:migrate:dropをした時の対処法

誤って

$ rails db:drop

してしまった時は

$ rails db:reset

で戻す。

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

【Rails】マイグレーション up,downをchangeと比較して理解する

記事の対象者

・Railsのマイグレーションにおけるchangeメソッドは知っているが、up,downメソッドが出てきて違いがよくわからない初学者
・マイグレーションを追加して、適用(マイグレファイル作成、rails db:migrate)はしたことがあるが、適用の取り消しをしたことがない方

※Railsガイド、書籍「現場で使えるRuby on Rails5速習実践ガイド」を基に解釈して書いております。
解釈が間違っていたら、指摘頂ければ幸いです。(もしくは、書籍やRailsガイドを参照下さい。)

前提知識(マイグレーションは、適用だけでなく適用を取り消せるよ)

マイグレーションにおいては、1つのマイグレーション(ファイル)が1つのバージョンとして扱われます。つまるところ、1つのマイグレーションを適用することでデータベースのバージョンを1つあげることができ、適用済のマイグレーションを1つ取り消すことでバージョンを1つ下げることができる。
→バージョンの上げ下げ(適用、適用を取り消す)を意識できていないとup,downメソッドが理解できません!!

changeメソッドについて(自動で適用を取り消す処理をしてくれるよ)

以下のようにマイグレーションファイルでは、changeというメソッドの中でtasksテーブルを作成しています。
一見すると、バージョンをあげる(テーブルを作成する)時のコードだけが書かれているように見えますが、実はバージョンを下げる(テーブルを削除する)処理も適切に行なってくれます。

class CreateTasks < ActiveRecord::Migration[5.2]
  def change
    create_table :tasks do |t|
      t.string :name
      t.text :description

      t.timestamps
    end
  end
end

changeでサポートされているマイグレーション定義(これらならchangeの中で使えるよ)

以下は、Railsガイドに掲載されているです。
(上記の例で挙げたcreate_tableは、一覧に入っているのでchangeメソッドを利用します。)

add_column
add_foreign_key
add_index
add_reference
add_timestamps
change_column_default (:fromと:toの指定は省略できない)
change_column_null
create_join_table
create_table
disable_extension
drop_join_table
drop_table (ブロックを渡さなければならない)
enable_extension
remove_column(型を指定しなければならない)
remove_foreign_key(2番目のテーブルを指定しなければならない)
remove_index
remove_reference
remove_timestamps
rename_column
rename_index
rename_table

up,downについて(自動で適用を取り消す処理をしてくれないよ)

上記、changeでサポートされているマイグレーション定義以外のもの(以下の例だと「change_column」)については、自動でバージョンを下げる(テーブルを削除する)処理を行ってくれないので、upでバージョンをあげる処理に加え、downでバージョンを下げる処理を記述する必要があります。

class ChangeTasksNameLimit30 < ActiveRecord::Migration[5.2]
 def up
  change_column :tasks, :name, :string, limit: 30
 end

 def down
  change_column :tasks, :name, :string
 end
end

もし、上記のdownの部分を書かずに、バージョンを下げようと適用済のマイグレーションを取り消そうとする場合、automatically reversible(自動的に戻せない)であるという例外が発生します。

まとめ

changeがサポートしているマイグレーション定義なら、バージョンを下げる記述をしなくてもバージョンを下げられる。
changeがサポートしてないマイグレーション定義(上の例だとchange_column)で記述する場合は、downを書かないとバージョンを下げられない。

また、この記事で雰囲気がわかったら、Railsガイドの固めの表現も理解できると思います。

参考

・Railsガイド
https://railsguides.jp/active_record_migrations.html#up-down%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%82%92%E4%BD%BF%E3%81%86

・書籍「現場で使えるRuby on Rails5速習実践ガイド」

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

Ruby経験者がRustを使ってみて比較してみた 2020冬

少し前になりますが、お世話になっていた職場で新しい技術に触れさせて頂ける機会を頂いので、Rustを使ってみました。RustはRubyと世界観が似ていて、理解しやすい部分も多くありました。

今回は、Ruby/Railsの世界と比較して、やったことをまとめてみようと思います。

Rustのいいところ

そもそもなぜRustに興味を持ち、使ってみようと思ったのか。
Rust公式

  • コンパイル型言語のメリット
    • 使ってみた感想を後述
  • パフォーマンスが良い
    • 使ってみた感想を後述
  • 並列処理
    • 今回はたどり着けず
  • Web Assembly
    • 調べてみると、Rustだけではなく他言語も対応していてあまり興味をひかれず、対象外
  • CLIツール
    • 簡単に作れて配布が楽。
    • 使ってみた感想を後述

Rustを書いてみる

Rust のチュートリアル(The book)を読んで、Guessing gameという例題をプログラミングしました。

感想

  • 所有権で、変数のスコープ・ライフサイクルをより厳密に管理できる
    • 保守的にプログラミングすると自然に書けて、ケアレスミスを防いでくれるガイドのよう
  • C言語/C++、C#、Rubyっぽさもあり、バックグラウンドがあれば文法はそれほど難しくない
  • コンパイルすると、参照や定義がきちんと追跡できる。実装にも役立つし、読むのにも良い
  • Rubyみたいなダックタイピングでゆるふわコーディングはできないので、なれるまでコンパイルエラーは増えそう
  • buildしたものを実行するだけなら光速
  • 実行は速いが、バイナリのファイルサイズは大きくなる
  • 個人的には結構好き

Rubyと用語比較

Rubyがわかれば、これを見ればイメージつかめると思います。Gemに関連する使い勝手も結構似ていて使いやすいと思いました。

Ruby Rust
Gem Crate
Bundler Cargo
Class Struct
インスタンスメソッド メソッド
Hash Vector
array.each for x in array

APIサーバーの実装をRailsと比較する

簡単な例に習って、Rest APIサーバーを PostgreSQLで実装しました
https://github.com/Samemura/rust-web-api-with-db

感想

  • 小規模なら全然あり
  • buildや実行が速い。と思う
    • Railsみたいにライブラリが重くないからというのもありそう
  • アーキテクチャに熱い人は使い勝手が良さそう
  • テストしやすさは、評価できず

Railsとの比較

今回は、公式を見てRocketを使ってみた。後から教えてもらったが、実際に普及しているのはActix-webらしい。以降はRocketとRailsの比較。

項目 Rails Rocket
ORM ActiveRecord Diesel

ただし、DBによってライブラリを使い分ける必要がある。DieselはPostgreSQLとMySQL, SQLiteのみ。
ディレクトリ構成 厳格に決められている 自由

アーキテクチャやレイヤー構成を自分たちで決めて運用する必要がある
Routing routes.rbにDSLで記述 rocketをマウントする際に、controller的 functionを渡す
functionのattribute(プリプロセッサのようなもの)でパスを定義
Controller Controller クラスで実装 functionで実装。特に制限はなし
リクエストのパラメータは、Structを定義してparseする。parseはいい感じやってくれるので結構簡単。
Model Modelクラスで実装 Structで実装。特に制限はなし
ORMしたものとは別に、insert時に使うモデルやselectで取得したものを分けて扱える。
ActiveModelがいっぱいある感じ。似たようなものが増えそうだが、影響範囲が明確なので保守性は良さそう
Migration DSLで記述 Up/Downを分けてSQLを記述

SQLで書いた方が分かりやすい気がする。Up/Downも明確。

CLIツールを作ってみた

簡単に作れるとのことで、身近に使えるものが思いついたので作ってみた。
発表順などでランダムに順番決めるときに使える。
https://github.com/Samemura/kaiten-sushi

感想

  • crates.ioに公開するまではとても簡単にできた
    • 手順はこちら
    • インストールする人はcargo 使えば簡単に導入できる
  • バイナリを直接インストールする方法は結構大変だった
    • 手順に載っているので、軽くできそうで試してみる
    • TravisCI でプラットフォームごとにビルドして、Trustというライブラリのinstall.sh でインストールできるようにする必要がある
      • TravisCIでビルドするけど、デプロイタスクが失敗
      • macosはTrustでサポートされてない
      • 詰んだ?
    • ローカルでビルドすれば mac osのバイナリを作れる
      • Trustのinstall.shは GitHubのReleaseの最新版をの添付ファイルをプラットフォームに応じて取ってくる
      • TravisCIのスクリプト例を参考に、名前付け・アップロード
    • 結構大変だったけど、なんとかできた
    • 確かにCargoなしでもインストールは楽にできる
    • 後から検証してみると、rustcは必要っぽい。
  • CLIを作るのにライブラリのインターフェースは向いてるので、作りやすかった
  • npmでも使えるし、 Rubyからコールすることもできるので将来性ある(Routie)

まとめ

かなり雑なまとめではあるものの、Ruby経験者が雰囲気掴むのには良いかと思います。Trustでのインストールのあたりは、確かな情報があれば教えてもらえるとありがたいです。

英語情報の日本語化は結構されているけど、コミュニティーが英語メインのようで細かい情報はそちらを探す必要がありそうでした。

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

Ruby経験者がRustを触って比較してみた 2020冬

少し前になりますが、お世話になっていた職場で新しい技術に触れさせて頂ける機会を頂いので、Rustを使ってみました。RustはRubyと世界観が似ていて、理解しやすい部分も多くありました。

今回は、Ruby/Railsの世界と比較して、やったことをまとめてみようと思います。

Rustのいいところ

そもそもなぜRustに興味を持ち、使ってみようと思ったのか。
Rust公式

  • コンパイル型言語のメリット
    • 使ってみた感想を後述
  • パフォーマンスが良い
    • 使ってみた感想を後述
  • 並列処理
    • 今回はたどり着けず
  • Web Assembly
    • 調べてみると、Rustだけではなく他言語も対応していてあまり興味をひかれず、対象外
  • CLIツール
    • 簡単に作れて配布が楽。
    • 使ってみた感想を後述

Rustを書いてみる

Rust のチュートリアル(The book)を読んで、Guessing gameという例題をプログラミングしました。

感想

  • 所有権で、変数のスコープ・ライフサイクルをより厳密に管理できる
    • 保守的にプログラミングすると自然に書けて、ケアレスミスを防いでくれるガイドのよう
  • C言語/C++、C#、Rubyっぽさもあり、バックグラウンドがあれば文法はそれほど難しくない
  • コンパイルすると、参照や定義がきちんと追跡できる。実装にも役立つし、読むのにも良い
  • Rubyみたいなダックタイピングでゆるふわコーディングはできないので、なれるまでコンパイルエラーは増えそう
  • buildしたものを実行するだけなら光速
  • 実行は速いが、バイナリのファイルサイズは大きくなる
  • 個人的には結構好き

Rubyとの用語比較

Rubyがわかれば、これを見ればイメージつかめると思います。Gemに関連する使い勝手も結構似ていて使いやすいと思いました。

Ruby Rust
Gem Crate
Bundler Cargo
Class Struct
インスタンスメソッド メソッド
Array 配列、Vecなど
Hash HashMapなど
array.each for x in array

APIサーバーの実装をRailsと比較する

簡単な例に習って、Rest APIサーバーを PostgreSQLで実装しました
https://github.com/Samemura/rust-web-api-with-db

感想

  • 小規模なら全然あり
  • buildや実行が速い。と思う
    • Railsみたいにライブラリが重くないからというのもありそう
  • アーキテクチャに熱い人は使い勝手が良さそう
  • テストしやすさは、評価できず

Railsとの比較

今回は、公式を見てRocketを使ってみた。後から教えてもらったが、実際に普及しているのはActix-webらしい。以降はRocketとRailsの比較。

項目 Rails Rocket
ORM ActiveRecord Diesel

ただし、DBによってライブラリを使い分ける必要がある。DieselはPostgreSQLとMySQL, SQLiteのみ。
ディレクトリ構成 厳格に決められている 自由

アーキテクチャやレイヤー構成を自分たちで決めて運用する必要がある
Routing routes.rbにDSLで記述 rocketをマウントする際に、controller的 functionを渡す
functionのattribute(プリプロセッサのようなもの)でパスを定義
Controller Controller クラスで実装 functionで実装。特に制限はなし
リクエストのパラメータは、Structを定義してparseする。parseはいい感じやってくれるので結構簡単。
Model Modelクラスで実装 Structで実装。特に制限はなし
ORMしたものとは別に、insert時に使うモデルやselectで取得したものを分けて扱える。
ActiveModelがいっぱいある感じ。似たようなものが増えそうだが、影響範囲が明確なので保守性は良さそう
Migration DSLで記述 Up/Downを分けてSQLを記述

SQLで書いた方が分かりやすい気がする。Up/Downも明確。

CLIツールを作ってみた

簡単に作れるとのことで、身近に使えるものが思いついたので作ってみた。
発表順などでランダムに順番決めるときに使える。
https://github.com/Samemura/kaiten-sushi

感想

  • crates.ioに公開するまではとても簡単にできた
    • 手順はこちら
    • インストールする人はcargo 使えば簡単に導入できる
  • バイナリを直接インストールする方法は結構大変だった
    • 手順に載っているので、軽くできそうで試してみる
    • TravisCI でプラットフォームごとにビルドして、Trustというライブラリのinstall.sh でインストールできるようにする必要がある
      • TravisCIでビルドするけど、デプロイタスクが失敗
      • macosはTrustでサポートされてない
      • 詰んだ?
    • ローカルでビルドすれば mac osのバイナリを作れる
      • Trustのinstall.shは GitHubのReleaseの最新版をの添付ファイルをプラットフォームに応じて取ってくる
      • TravisCIのスクリプト例を参考に、名前付け・アップロード
    • 結構大変だったけど、なんとかできた
    • 確かにCargoなしでもインストールは楽にできる
    • 後から検証してみると、rustcは必要っぽい。
  • CLIを作るのにライブラリのインターフェースは向いてるので、作りやすかった
  • npmでも使えるし、 Rubyからコールすることもできるので将来性ある(Routie)

まとめ

かなり雑なまとめではあるものの、Ruby経験者が雰囲気掴むのには良いかと思います。Trustでのインストールのあたりは、確かな情報があれば教えてもらえるとありがたいです。

英語情報の日本語化は結構されているけど、コミュニティーが英語メインのようで細かい情報はそちらを探す必要がありそうでした。

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

Dry::Struct導入

参考

https://dry-rb.org/gems/dry-struct/1.0/
https://dry-rb.org/gems/dry-types/1.2/

やったこと

Gemfile
gem 'dry-struct'
gem 'dry-types'
bundle
app/models/xxxxx.rb
class Xxxxx < Dry::Struct
  module Types
    include Dry.Types
  end
end

結果

-> % bin/rails c
Running via Spring preloader in process 34185
Loading development environment (Rails 6.0.3.3)
[1] pry(main)> Dry::Struct
=> Dry::Struct
[2] pry(main)> Xxxxx
=> Xxxxx
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

買付代行サービスにRspecとFactoryBotを導入した

参考

https://qiita.com/Ushinji/items/522ed01c9c14b680222c
https://qiita.com/key_it6/items/fb94f229e9e45270c515

やったこと

Gemfile
group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]

  gem 'factory_bot_rails' #追加
  gem 'rspec-rails' #追加
end

group :development do
  # Access an interactive console on exception pages or by calling 'console' anywhere in the code.
  gem 'listen', '>= 3.0.5', '< 3.2'
  gem 'web-console', '>= 3.3.0'
  # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
  gem 'spring'
  gem 'spring-commands-rspec' #追加
  gem 'spring-watcher-listen', '~> 2.0.0'
end
Terminal
bundle

bin/rails generate rspec:install
spec/rails_helper.rb
省略
Dir[Rails.root.join('spec/support/**/*.rb')].sort.each { |f| require f }
省略
spec/support/factory_bot.rb
RSpec.configure do |config|
  config.include FactoryBot::Syntax::Methods
end

結果

Terminal
-> % bin/rspec
Running via Spring preloader in process 32344
No examples found.


Finished in 0.00101 seconds (files took 0.49014 seconds to load)
0 examples, 0 failures
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rubyのステップアップなら→ Udemy「はじめてのRuby on Rails入門-RubyとRailsを基礎から学びWebアプリケーションをネットに公開しよう 」

エンジニアの学習って大変ですよね。私もよく予定を全て断ってプログラミングの勉強をしていました。
今はpythonとRubyを学習しているのですが、Rubyの学習でおすすめな教材があったので今回記事を書きました。
また、このRubyで学んだことはいま学習しているpythonの内容と合致する部分が多く、学習コストが低くなります。
求人数が多い言語として元々人気でしたが、他の言語にも移りやすく第一言語としても最適なので、今回はステップアップ講座ということで私も購入しました。

動画詳細

・・・・・・・・・・・・・・・・
動画詳細はこちら↓
はじめてのRuby on Rails入門-RubyとRailsを基礎から学びWebアプリケーションをネットに公開しよう
https://px.a8.net/svt/ejp?a8mat=2TIO46+EOP6GA+3L4M+BW0YB&a8ejpredirect=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fthe-ultimate-ruby-on-rails-bootcamp%2F
・・・・・・・・・・・・・・・・

学習メリット

Udemyではこのようにエンジニア向けの講座が沢山ありますが、今回の講座はステップアップできる講座で、なおかつ初心者向けでもあります。
また、Herokuといったサービスを使ってWEBサービスを公開するところまでサポートしてくれます。

プロゲートもで学習している人も、楽しくないならこの講座のような実践形式のものに勉強方法を変えてみるのも手だと思います。

おすすめ対象

・Ruby on Railsの参考書1冊終えた方
・Webサービスを作ってみたい方
・Webサービスの公開方法を知りたい方

とにかく、Rubyの知識はあった上での受講であるとより望ましいかも知れません。

学習内容

・Ruby on RailsとRubyを使った実践的な開発スキル
・Webサービスを公開する方法
・AWS Cloud9を使った開発環境の構築
・Ruby on RailsとRubyの違いを理解
・クラウドサービス、HerokuのPaaS(Platform as a Service)を使って自分のサービスをネット上に公開する方法を学ぶ
・Web系の企業転職の際に魅力的に映るポートフォリオサイトの作成

講義内容に関して

講師はプログラミングスクールを経験している方だったので、とても分かりやすく解説してくれるのでとても学びやすいです。
また、実際に作ったWebサービスをHeruku上に公開するまでを学習することができるので入門的な知識からステップアップする事もできます。

講義自体はAWSのcloud9を使って進めていますが、プログラムの基本的な書き方まで網羅してくれているのでとてもためになります。
実際に、演習問題ではFizzbuzz問題や条件分岐、繰り返し処理などもありましたが、私はコーディング面接の際にこのFizzbuzz問題が出題されたので、学習してよかったと思いました。
しかし、講師の入力はとても早いので、ついていけない人は動画の再生速度を下げたほうがいいかも知れません。

私はこの講義を参考にデモのSNSを作りましたが、基礎的なものとなにかの制作に必要なちしきはきちんとカバーされてますので、学習して損はないと思います。

動画詳細

・・・・・・・・・・・・・・・・
動画詳細はこちら↓
はじめてのRuby on Rails入門-RubyとRailsを基礎から学びWebアプリケーションをネットに公開しよう
https://px.a8.net/svt/ejp?a8mat=2TIO46+EOP6GA+3L4M+BW0YB&a8ejpredirect=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fthe-ultimate-ruby-on-rails-bootcamp%2F
・・・・・・・・・・・・・・・・

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

has_many throughで重複したデータをdistinctしたい

問題

例えばこういう関係のモデルがあったとして

class User < ApplicationRecord
  has_many :lists
end

class List < ApplicationRecord
  belongs_to :user
  belongs_to :product
end

class Product < ApplicationRecord
  has_many :lists
end

UserはListを複数持っていて、各ListはProductを参照していて...
Userに関連するProduct全部持ってきたい...

解決方法

class User < ApplicationRecord
  has_many :lists

  # これだとListの数分重複するProductが返ってくる
  # has_many :products, through: :lists 

  # distinctを差し込んでやる
  has_many :products, ->{ distinct }, through: :lists
end

すごく便利(ここを参照しました)

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

いいね機能を利用したユーザー評価

はじめに

オリアプ制作の中で、購入機能をつけ、その商品の詳細は購入後でしか見られないものにした。
そのため、売る側ユーザーの評価を見られるようにすることで、買う側ユーザーの購入の決め手となるような機能が必要であった。
それを今回は商品に対してのいいね機能を利用して、ユーザー評価(Good or Bad)をつけるように実装した。

実装までに完了している条件

1.deviseのgemを既に導入している・内容も記述している
2.商品をideaと定義し、ideaモデル、ideaコントローラーを作成済み・内容も記述している
3.userとideaのルーティング設定・アソシエーション等も完了している

1.いいね機能の実装(Good評価)

1.いいね機能を実装にあたり、まずは UserID と IdeaID を格納するための Likeテーブル(中間テーブル)を作成する。

ターミナル
$ rails g model like post:references user:references
$ rails db:migrate

2.userモデル、ideaモデル、likeモデルをそれぞれアソシエーションする。

userモデル
class User < ApplicationRecord
# 中略
  has_many :likes
end
ideaモデル
class Idea < ApplicationRecord
# 中略
  has_many :likes
end
likeモデル
class Like < ApplicationRecord
  belongs_to :user
  belongs_to :idea
end

3.likeコントローラーを作成する。
今回はいいねを保存するだけなので、createアクションのみをlikeコントローラーに定義する。

ターミナル
$ rails g controller likes
likeコントローラー
class LikesController < ApplicationController
  def create
    Like.create(user_id: current_user.id,idea_id: params[:idea_id])
    redirect_to root_path
  end
end

4.ルーティングを設定する。
like は idea に関連しているため、ideaにネストして設定する。

routes.rb
Rails.application.routes.draw do
# 中略
  resources :ideas,except: :index do
    resources :likes, only: :create
    # 中略
  end
# 中略
end

5.viewファイルにいいねボタン(Goodボタン)が表示される様に記述する。

views/ideas/show.html.erb
<!--中略-->
<div>
 <%= button_to 'Good', idea_likes_path(@idea), class:'good-btn' %>
</div>
<!--中略-->

2.いいね機能の実装(Bad評価)

いいね機能の実装(Good評価)の likedislike に置き換え、もう一度同じ工程を行う。

商品購入後の画面に以下の画像のようなGoodボタン・Badボタンを追加表示することが出来た。

3.ユーザー評価(Good Bad)の表示

今回の目的は商品を売る側ユーザーの評価が分かるようにするための機能を実装するということなので、そのユーザーの全商品に付けられているGood or Bad の合計を取得し、表示する必要がある。
ユーザー評価はユーザーページで表示するようにしたいため、showアクションに記述していく。

1.UserコントローラーでUserに結びつくIdeaを取得する。

Userコントローラー
class UsersController < ApplicationController
  def show
    @user = User.find(params[:id])
    @user_ideas= @user.ideas
  end
end

2.eachメソッドを用いて、変数@likes_count と 変数@dislikes_count それぞれ合計を計算するコードを記述する。

Userコントローラー
class UsersController < ApplicationController
def show
    @user = User.find(params[:id])
    @user_ideas= @user.ideas
    # Goodの合計を計算する
    @likes_count = 0
    @user_ideas.each do |idea|
      @likes_count += idea.likes.count
    end

  # Badの合計を計算する
    @dislikes_count = 0
    @user_ideas.each do |idea|
      @dislikes_count += idea.dislikes.count
    end
  end
end

3. views/users/show.html.erb に@likes_count(Good評価)と @dislikes_count(Bad評価)を記述し、表示する。

views/users/show.html.erb
<div class="good-button"><%= @likes_count%></div>    <!--Good評価-->
<div class="bad-button2"><%= @dislikes_count%></div>  <!--Bad評価-->

4.実装完了

ユーザーページで以下の画像のように表示されるようになった。
Good と Bad の数が表示され、そのユーザーの評価を見られる様になった。

5.最後に

今回実装するにあたり、中間テーブルなどをもう一度学習することが出来たので、良い復習になったなと思います。

6.参考記事

以下の記事を参考に実装しました。ありがとうございました。
https://qiita.com/nojinoji/items/2c66499848d882c31ffa
https://freecamp.life/rails-favorite/
https://yumanoblog.com/rails-likes/

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

renderとredirect_toの違い

render

viewを返す

redirect_to

routesに遷移し、引数に該当するroutesを探す

→使い道としては「エラーが起きた時などにエラー処理を新たにcontrollerで走らせたい」だったり、「viewには表示したくないけど、内部でcontrollerのactionを走らせたい」だったりの処理をしたい時に使う。

参考文献

https://qiita.com/january108/items/54143581ab1f03deefa1

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

Chrome + ELB(ALB) で接続が異常に遅い問題

はじめに

https通信にしたくてELBを構成しブラウザ(Chrome)からhttps://ドメイン名/でアクセスするとレスポンスは返ってはくるが1分以上かかるという現象に遭遇しましたので備忘録

確認した事

Chromeのデベロッパーツールで何がそんなに時間がかかっているのかを確認

スクリーンショット 2021-01-14 16.02.58.jpeg

initial connectionというのがやたら長い

Googleで検索 initial connection 遅い

下記の記事がヒット

https://qiita.com/TakenoriHirao/items/a3ace404d785e6a4db22

原因

ELB(ALB)では2つのサブネットを設定するが、プライベートなサブネットを設定するとこの現象が起きるらしい

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

モジュールについて

こんにちは!

リンピンです?

今回は
モジュール
の言葉の意味について調べたことを書かせていただきます。

1,モジュールの意味
2,使うことによるメリット、デメリット

1,モジュールの意味

まずはじめにモジュールの意味について書いていきます。
調べた結果からすると

機能を一つずつ分けて、他のファイルから読み込めるようにした処理のまとまりのこと

らしいです。

もともとは、
建築等の工学的に何かを設計する時に用いる概念で、設計対象を構成する要素であり
これらを組み合わせることで、目的物の作成ができるといった流れのようです。

これをプログラミングで例えると

バラバラにそれぞれの機能を作成し(要素)
個別に動作確認をしたあと
組み合わせることで完成品を得られるといった流れになる
(上記3行が概念に値するかと)

2,使うことによるやメリット、特徴

複数人での開発が多いことから
個々のモジュールを部品のように扱うことによって
一度作成したモジュールを
モジュール単位で扱うことができ、
分業を容易にしたり
使いまわしがきくなど
効率化に貢献してくれる
ことがメリット、といいますか特徴ですね。

何か間違っていたり、もっと良い解釈があれば教えていただけると幸いです!

参考文献:https://gimo.jp/glossary/details/moduel.html

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

プログラミングスクール「RUNTEQ」は凄すぎました

RUNTEQに入校して1ヶ月

技術ではなく個人の体験ですが、プログラミングスクール「RUNTEQ」に入校して1ヶ月が経過したので、RUNTEQの感想を書きたいと思います。

結論から申し上げると「RUNTEQはすごくいいぞ」です。
他のスクールについて当然入校をしたことがないので他のスクールの質はよくわかりません。
ですが、未経験から転職を目指すならRUNTEQがベストだと自信を持って言えます!!

結論から申し上げると「RUNTEQはすごくいいぞ」です。
他のスクールについて当然入校をしたことがないので他のスクールの質はわかりません。
ですが、未経験から転職を目指すならRUNTEQがベストだと自信を持って言えます!!

RUNTEQ?何それ?

私がRUNTEQに入校を決めたのはちょうど1ヶ月ほど前でした。
それ以前はプログラミングを自分で学びながら、2ヶ月かけてたくさんのプログラミングスクールに関するネットの記事を読みあさっていました。
しかし、2ヶ月という期間がありながら、RUNTEQを見つけたのは入校する2週間前です。
つまり、2ヶ月間ずっと色々な記事を見てきたにもかかわらず、その間ほとんどRUNTEQを見かけていなかったのです。

理由は簡単で「広告をほとんど出してないから」です。

芸能人の小籔さんが年始から大々的に宣伝しているテックキャンプ。
厚切りジェイソンさんが宣伝しているTechAcademy[テックアカデミー]。

プログラミングスクールは今や数多く存在しているので、様々な広告が流れています。
でも、認知度が高いものは上述した2校ではないでしょうか。
つまり、至極当然ですが有名なプログラミングスクールは広告をめちゃくちゃ出してるから有名であり、広告を出していないRUNTEQは知名度が高くなかったんですね。

自分はRUNTEQを見つけた時には、別のスクールに入校を決めていました。
しかし、調べていく中でRUNTEQの評判がとても良かったので、説明会に申し込みました。

説明会前に得られた情報としては以下の2つだと思います。

1. スタートアップの自社開発企業に特化している
2. 想定の学習時間が900時間と他のスクールと比べて長いこと

スタートアップの自社開発企業に特化している

自社開発企業とは自社でサービスを持っている会社ですね。
例を挙げると、メルカリ、LINEとかに当てはまります。

しかし、そういった有名企業にいきなり未経験エンジニアが入るのは難しいです。
未経験エンジニアの間口自体も今非常に狭いので、未経験からそういった大企業に入るのはまず無理でしょう。

しかし、スタートアップ企業であれば間口は大手自社開発企業より広いので、まずスタートアップ企業に就職することを強く進めています。
実際、卒業生のほとんどはスタートアップの自社開発企業に行っています。

「え、他のプログラミングスクールなら卒業生で大手行ってるとこあるよ」
そう思うかもしれませんが、それは果たして自分に当てはまるでしょうか。

例えば、在校生が1万人いる大学から100人という1%の人が大手企業に入社できたという事実があるとします。
そして、その大学の説明会では「うちの大学の卒業生からはこのような大企業に合格している(1%だけだけど)」と事実を隠し聞こえのいいように紹介され、「ここに入れば自分もそういった大企業に行けるぞ」と思い込んでいるだけです。
実際入ってみると想像とは違うFラン企業に行かされる場合だってあるわけですね。

加えて言うと、Web系のスタートアップの自社開発企業に未経験エンジニアとして転職することは、間口が広いとはいえ非常に厳しいです。
新型コロナウイルスに伴って採用は縮小しているのに、エンジニアになってリモートワークで自由な働き方に憧れる人が増えて、現状エンジニアは買い手市場です。国内最大規模のエンジニアオンラインサロンを運営している勝俣健太さんは、「2000人エンジニアになりたいとしたら100人ぐらいしか自社開発企業に受からない」とおっしゃっていました。

話が脱線してしまいましたが、難易度が高くてもまずはスタートアップの自社開発企業に転職し、経験を積むことがRUNTEQの方針となります。

想定の学習時間が900時間と他のスクールと比べて長いこと

900時間って想像より長いです。
私は収入が途絶えてしまうのは現状リスクが高いと考え、働きながらプログラミングスクールを受講する予定でした。
働きながら時間を捻出して1ヶ月150時間勉強したとしても半年もかかります。

逆に他のスクールでは600時間程度がほとんどかと思います。
「600時間なら最短でエンジニアになれる」と私は考えていましたが、現状のエンジニア買い手市場を考慮すると、勉強時間が短いのは危険かと思いました。実際、エンジニアとして未経験から転職するなら1000時間の学習がないとおっしゃっている方々が多くいて、600時間では十分な実力に至らないと感じました。

説明会の内容

説明会当日は自分1人のために1時間の説明会を2人の担当者で行ってくださいました。
それまでに何校ものプログラミングスクールの説明会を受けていましたが、説明会は大体多くとも30分ほどで、形式もマンツーマンか、担当者1人対複数の参加者でしたので驚きました。

そして、実際にそのスクールのSlackの生徒の交流を見せてくれてたり、6ヶ月の長い期間の中でのカリキュラムの進め方など、とても具体的な説明を受けました。1時間と長い時間を取っているだけあって、疑問点がないように説明をしていただけました。
そのため、今までの説明会と違いスクールの実際の雰囲気や入校した後の自分のイメージができました。

説明会の中で以下の3点がRUNTEQの特徴として挙げられると思いました。

1. スクール内のコミュニティが活発
2. 1週間の学習時間の目安は25~30時間
3. 転職保証がない

スクール内のコミュニティが活発

RUNTEQで他のスクールと一線を画すと思ったのはコミュニティでした。
大きな違いは、「卒業生もそのコミュニティに永遠に参加し続けることができる」、です。

他のプログラミングスクールの卒業生の情報を見ると、卒業したらすぐ転職活動に入るため卒業したらコミュニティは解散というケースが多いという印象です。
しかし、RUNTEQでは見事未経験から自社開発企業に転職した先輩エンジニアがいつまでもそのコミュニティに参加を続け、受講生とかかわり続けています。
イメージとしては、高校の部活で最上級生は2つ上の先輩までですが、RUNTEQだと先輩の上の先輩とも容易に関わることが可能ということです!

基本的に他のプログラミングスクールだとコミュニティは同期という括りまでですが、RUNTEQは先輩も後輩も、さらには運営している方々も一つのコミュニティに参加しているので、オンラインサロンみたいな感じです。

1週間の学習時間の目安は25~30時間

わかってはいましたがそれ相応の勉強時間の確保はやはり必要だと説明されました。
30時間は、平日は仕事の時間を差し引くと1日3時間ほど、休日は7時間ほどやってやっと満たすことができます。
半年間遊ぶ時間はないですね(笑)

しかし、それぐらいの覚悟がないと未経験エンジニアとして転職できないということかなと改めて思いました。
1週間20時間のペースで短期間で学習した人と、1週間30時間のペースで長期間学習した人、どっちが成果を出せる可能性があるのかなんて聞く必要がないですね。後者です。
なのでむしろ自分がこのスクールに挑戦することでエンジニアとして生きていけるかどうかの足切りになるかと考えました。

転職保証がない

そしてこれは知らなかったのですが、RUNTEQは転職保証をしていないと説明を受けました。

「え!?!?!?転職保証ないの!?!?」と思われるかのしれませんが、自分は逆にすごく安心しました。
なぜなら、プログラミングスクールのたくさんの記事を読んだため、転職保証があるスクールが大体評判が良くなかったと感じたからです。(これは個人の意見ですのでどうかご容赦くださいませ)

転職保証。聞こえは必ず転職できるということで良いかもしれません。
ですが、紹介された企業には興味がなくても必ず面接に行かなければならない、内定が1つでも出たら転職保証は消えるなど、転職保証が
必ず良いことに繋がるとは限らないのです。むしろ、自分の希望しない企業に就職する確率が高まるかもしれません。

自分は現在SESに勤務しており、希望していた開発ではなくインフラの業務をしています。
他人任せで企業を紹介してもらうシステムはかなりうんざりしています。

なので、転職保証しないと明言していただいた方がかえって信頼できるなと安心しました。

これらの説明を受けて自分はRUNTEQで学んでみたいと強く思い入校することを決めました。
また、テックキャンプを返金しRUNTEQを受講している方の2校の比較動画もとても参考になりました。

比較動画

入学後のギャップはなし!!むしろ想像以上!

RUNTEQを入学して、期待とともに不安も当然ありました。
ある程度それまでにプログラミング学習を済ませていたので、申し込んだコースはある程度学習を済ませた方向けのコースを申し込みました。
そのため、受講額も最安値のプランで申し込めましたが、それでも新卒SES社員としては高額な支払いではありました。

しかし、入学後は説明会で聞かされていた内容の遥か上を行きました!

圧倒的に活発なコミュニティ

RUNTEQでは受講生との関わりがとても密です。

RUNTEQには受講生の個人用チャンネルを開設し、そのチャンネルに受講生やRUNTEQ講師陣が参加できる仕組みがあります。
そして、受講生は自分用のチャンネルをアウトプットのためにTwitterのように使用します。
他の受講生はそのアウトプットに対してコメントしたりスタンプを押したりしています。
結果、1人でプログラミング学習をするということはなく、後輩、先輩、講師が自分の学習を見てくれるのです。

加えて、イベントもとても盛んです。
DiscordというLINEとZOOMを足して2で割ったような便利なアプリがあるのですが、そこで毎週のように生徒が交流イベントがあったり、講師からの勉強会があったり、みんなでもくもく会も開いたりします。
RUNTEQのコミュニティがとてもラフなので、卒業生や生徒がイベントの集合をかけて集まったりもします。
この間は最近はやりのAmong usというゲームをやるだけの会が催され、ゲームを通して交流を深めることができました。(しかも運営の方も参加しました(笑))

プログラミングを1人で学習を続けることはとても辛いです。
コミュニティを提供するプログラミングスクールもオンラインのため教室が使えなくなり、他の生徒と交流できないことが多いのではないでしょうか。
そのような状況下でもRUNTEQのコミュニティは自分の学習の励みになりますし、友達や尊敬できる人がたくさん増え、めちゃくちゃモチベーションが上がりました。

受講している生徒のレベルの高さ

RUNTEQの受講生の評判はとどまることを知りません。

例えば、Twitterでバズったエンジニアチェッカーという受講生のポートフォリオがあります。
ご存じの方もいらっしゃるのではないでしょうか?
知らないという方は下記記事をご参照ください。エンジニアチェッカーを作成された方の記事です。

プログラミングを始めて3ヶ月半の未経験が「エンジニアチェッカー」を作ってインフルエンサーを撲滅してしまった話

卒業生もレベルは高いのですが、受講生もほんとにレベルが高いです。
例えば、自分より1ヶ月早い11月より受講している生徒で、すでにあるゲームのコミュニティサイトを運営されている方もいらっしゃいます。
こちらもサイト運営者の記事がありますので、詳しく知りたい方は下記記事を参照ください。

【未経験エンジニア必見】独学で作ったWebサービスを実際に運営してみたら世界が広がった話

やはり、週30時間の勉強時間というのはかなりきついと思うので、それだけ本気でエンジニアになりたい人だけが申し込むということでしょうか。
意識が高い人だけが集まるようにフィルタリングされているような気がします。

詳しくは説明会で!!

この記事ではカリキュラムについてはあまり触れていません。
詳しくは説明会を申し込んでください。
おそらく自分と同じように長い時間をかけて丁寧に説明してくださいると思います。

RUNTEQホームページ

これからもRUNTEQで学んだ課題のアウトプットもしていくとともに、RUNTEQの情報も定期的に伝えていけたらいいなと思います。
ひとます、ここまで読んでくださった皆様、ありがとうございました。

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

Ruby on Rails カラム追加、削除の方法

目的

テーブルを作ったはいいけどカラムを追加したいときにやり方あってるかな?と不安になるので書いてみた。

カラムの追加方法

ターミナルでコマンドを打ちます。

rails g migration Addカラム名Toテーブル名 カラム名:型

例えば、1つだけ増やしたい場合は、

 rails g migration AddNameToPosts name:string

複数の場合は、

 rails g migration AddColumnsToPosts name:string day:data

AddColumnsToPostsのColumnsのところはどんな名前でもOKです。

最後に、

 rails db:migrate

でOKです!

カラムの削除方法

カラムの削除方法も書いておきます。

rails g migration Removeカラム名Fromテーブル名 カラム名:型

例えば、1つだけ増やしたい場合は、

 rails g migration RemoveNameFromPosts name:string

複数の場合は、

 rails g migration RemoveColumnsFromPosts name:string day:data

こちらもRemoveColumnsFromPostsのColumnsのところはどんな名前でもOKです。

最後に、

 rails db:migrate

でOKです!

参考

https://qiita.com/ITmanbow/items/2bf4dfa4d9ca705b97df
とても参考になりました!

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

【Rails6】deviseによる新規登録・ログイン時のリダイレクト先変更

はじめに

ポートフォリオ作成中に詰まった点を備忘録として記述しています。
今回は、deviseにてユーザー新規登録・ログイン機能を実装しました。法人会員と個人会員の2種類のログインユーザーがおり、新規登録時及びログイン時には、法人or個人によって違う画面遷移にしたいと思い、リダイレクト先の変更を試みました。

deviseではデフォルトでリダイレクト先が指定されているため、deviseのコントローラーをカスタマイズする必要がありました。

環境

Ruby on Rails'6.0.0'
Ruby'2.6.5'

前提

deviseを使用し、ログイン機能を実装済み。

①controllerの作成

ターミナル
% rails g devise:controllers companies

上記コマンドにより、法人側deviseのcontrollerを編集することができます。app/controllers/companies側にファイルが生成されると思います。

②ルーティングの設定

rails routesでルーティングを確認すると、

ターミナル
new_company_session GET      /companies/sign_in(.:format)             devise/sessions#new
company_session POST       /companies/sign_in(.:format)            devise/sessions#create
(省略)
new_company_registration GET      /companies/sign_up(.:format)        devise/registrations#new

上記のように表示されます。devise/sessionsやdevise/registrationでは、反映されないため、ルーティングでカスタマイズを行います。

config/routes.rb
devise_for :companies, controllers: {
    sessions:      'companies/sessions',
    registrations: 'companies/registrations'
  }

カスタマイズを行い、再度rails routesを行うと下記のように表記が変わると思います。

ターミナル
new_company_session GET      /companies/sign_in(.:format)             companies/sessions#new
company_session POST       /companies/sign_in(.:format)            companies/sessions#create
(省略)
new_company_registration GET      /companies/sign_up(.:format)        companies/registrations#new

③controllerの編集

ここから、リダイレクト先を指定するメソッドを定義します。

app/controllers/companies/registrations_controller.rb
class Companies::RegistrationsController < Devise::RegistrationsController
  before_action :configure_sign_up_params, only: [:create]
  before_action :configure_account_update_params, only: [:update]

  def after_sign_up_path_for(_resource)
    companies_articles_path(リダイレクト先のpath)
  end
(省略)
end
app/controllers/companies/sessions_controller.rb
class Companies::SessionsController < Devise::SessionsController
  before_action :configure_sign_in_params, only: [:create]

  def after_sign_in_path_for(_resource)
    companies_articles_path(リダイレクト先のpath)
  end
(省略)
end

上記でリダイレクト先を指定することができました!!!!

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

プロセスとスレッド、シングルプロセスとマルチプロセスの違い

■プロセスとスレッドの違いについて

1プログラム⇒1プロセス
1プロセスに複数のスレッドを動かすことが出来る(シングルスレッドとマルチスレッドがある)
スレッドがプロセス内の命令を実行する
1スレッドが1CPUコア使用する
1CPUに複数のCPUコアを含むことが出来る。

メモリー空間はプロセス単位で割り当てられる
スレッドが属するプロセスのメモリ空間を共有する

■シングルプロセスとマルチプロセスの違い
シングルプロセス:
 スレッド①:料理開始⇒ご飯を炊く⇒カレーを煮込む⇒お皿に盛る⇒料理終了
マルチプロセス:
 スレッド①:料理開始⇒プロセス②を起動⇒ご飯を炊く⇒プロセス②完了を待つ⇒料理終了
 スレッド②:カレーを炊く
 

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