20210620のRailsに関する記事は28件です。

railsチュートリアル 第5章

テスト駆動開発 エラー undefined local variable or method `static_pages_contact_url' `static_pages_contact_url'にアクセスしようとしたけれどアクセスできない ルーティングを直す。 ActionNotFound: The action 'contact' could not be found for StaticPagesController StaticPagesControllerの中にcontactアクションがない controllerを直す。 ActionController::MissingExactTemplate: StaticPagesController#contact is missing a template for request formats contactアクションまで動いているが、contactのテンプレートを探しているけどない。 Viewを直す。 <Contact | Ruby on Rails Tutorial Sample App> expected but was <Ruby on Rails Tutorial Sample App> Sample Appは動けるけど追加タイトルが入っていない。 サイトのタイトルを追加する URLをきれいにする方法 rootを作るとpathとurlができる root_pathはドメイン名が入らない。 root_urlはドメイン名が入る。 統合テスト ルート <% %>と<%= %>は違う コードは縦横並べて書く。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【備忘録】【Rails】provideとyieldの関係

viewでprovideヘルパーを利用することで、ここのテンプレートからレイアウト側にタイトルを引き渡すことができる。 app/views/devise/registrations/new.html.erb <% provide(:title, "新規登録") %> <h2 class="contents" >新規登録</h2> <div class="center"> <%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %> <%= render "devise/shared/error_messages", resource: resource %> <div class="field"> <%= f.label :email %><br /> <%= f.email_field :email, autofocus: true, autocomplete: "email" %> </div> <div class="field"> <%= f.label :password %> <% if @minimum_password_length %> <em>(<%= @minimum_password_length %> characters minimum)</em> <% end %><br /> <%= f.password_field :password, autocomplete: "new-password" %> </div> <div class="field"> <%= f.label :password_confirmation %><br /> <%= f.password_field :password_confirmation, autocomplete: "new-password" %> </div> <div class="actions"> <%= f.submit "新規登録する" %> </div> <% end %> </div> レイアウト側からは、yield メソッドを利用することで呼び出せる。 layouts/application.html.erb <!DOCTYPE html> <html> <head> <title><%= page_title(yield(:title)) %></title> <%= csrf_meta_tags %> <%= csp_meta_tag %> <%= stylesheet_link_tag 'application', media: 'all' %> <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> </head>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

herokuデプロイ後のエラー uninitialized constant ApplicationCable::ActionCable (NameError)

やっとherokuにデプロイできたのに 数々のエラーを解決してやっとの思いでherokuへデプロイ後 uninitialized constant ApplicationCable::ActionCable (NameError) こんなエラーメッセージが出てきたので解決方法を書き留めておきます。 heroku openするとエラー画面が ここに書いてあることを簡単に訳すと 「アプリケーションでエラーが出たので、次のコマンドでログを確認してください。」ということです。 $ heroku logs --tail ちなみに翻訳はこちらのDeepLがおすすめです! DeepLトップページ 「Google翻訳」よりも制度の高い日本語に翻訳してくれます。 そこで上記のコマンドを打ってログを見てみました。 ログを眺めてみる 今回はログの中にこんなエラーが表示されていました。 2021-06-20T11:17:05.170313+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=obscure-fjord-38948.herokuapp.com request_id=b4d66ca2-5f24-4cb8-996b-4b386d3b83fa fwd="126.255.41.232" dyno= connect= service= status=503 bytes= protocol=https これを調べてみたところ「アプリケーションが起動できず、ページを表示できない」とのこと。 参考 Heroku Dev Center そこで起動できない原因を探すためにログを見ると下記エラーが見つかりました。 /app/app/channels/application_cable/channel.rb:2:in `<module:ApplicationCable>': uninitialized constant ApplicationCable::ActionCable (NameError) このエラーを元に検索し、下記を追加することで解決です。 config/application.rb require "action_cable" [Rails-5] uninitialized constant ApplicationCable::ActionCable #23183 おわりに 最近エラー続きでしたが、エラー文やログをきちんと見るのって大切なんだなと実感しています。 書き忘れていましたが、herokuへデプロイ後すぐに $ heroku run rails db:migrate こちらを行っています。 以上、herokuデプロイ後のエラーを解決した方法でした。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Ruby】配列を条件に基づいて分割したい

概要 Enumerable#partitionメソッド使って、条件に当てはまるものとそうでないものに分類できます。 結果が真(true)の組みと偽(true以外)の組みの2つの要素からなる配列を返します。 array = [1,2,3,6,7,8] array_partition = array.partition {|i| i < 5} array_partition #=> [[1, 2, 3], [6, 7, 8]] array_partition[0] #=> [1, 2, 3] array_partition[1] #=> [6, 7, 8] どんな時に使うと便利? 数値などでpartitionメソッドを使って分割すると、真(true)の組みと偽(true以外)の組みに分割した配列を作成できて便利に使用できます。 例:3で割り切れる数値の配列とそうでない配列に分割 array = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0] array_partition = array.partition {|i| i % 3 == 0 } array_partition #=> [[9, 6, 3, 0], [10, 8, 7, 5, 4, 2, 1]] # 3で割り切れる数値の配列 array_partition[0] #=> [9, 6, 3, 0] # 3で割り切れない数値の配列 array_partition[1] #=> [10, 8, 7, 5, 4, 2, 1] 参考資料 Ruby 3.0.0 リファレンスマニュアルEnumerable#partition
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Ruby】 クラス、インスタンスとは?違いなどをプログラミング初心者のために解説!

背景 未経験からエンジニアを目指し勉強中です。 自分ひとりでWebアプリケーションを作ってみたり、日々精進しているところですが、 まだまだ精進が足りないと感じたため、理解できそうでいまいちできない「クラス」と「インスタンス」について、 私自身の備忘録も兼ねて、解説しようと思います。 また、本記事は「クラスとインスタンスついてざっくりと理解しよう」というコンセプトで執筆しておりますので、 発展的な内容に関しては別の記事で解説していこうと思います。 記事が出来次第こちらの記事からも飛べるようにいたします。 最後になりますが、初学者故に、至らぬ点が多々あるとは思いますが、温かく見守っていただけますと幸いです。 なお、何かお気づきの点があればコメントにてご指摘ください。 クラスとインスタンスの関係 クラスとは「モノを作る際の設計図」です。 例えば、人間というモノを作成するときの場合は以下のようになります。 皆さんもご存知の通り、人間にはそれぞれ個性があって、DNAから何から何まで全て同じ人は存在しません。 ですが、人間には共通しているところもありますよね。例えば、 身長があること 体重があること 目や口が存在すること などです。また、このような機能面以外にも、 食べる 笑う 走る などのアクション面も共通しています。 このように、「モノ」を作成するにあたって、もとになるような共通事項をまとめてあるものをクラスと言います。 この設計図をもとに「インスタンス」と呼ばれる実際の「モノ」を作成していくわけですね。 まとめ ざっくりとした説明ではありますが、これでクラスとインスタンスについての解説は以上になります。 同じプログラミング初心者の方にとって少しでも参考になれば幸いです。 ここまでご覧いただき誠にありがとうございました。 必要があれば、修正・追記をいたしますので、 何かお気づきの点などございましたら、コメントにてご連絡ください。 参考文献 クラスとオブジェクトとインスタンスの関係 【Ruby】クラスとかインスタンスについて改めて学習してみた 上記の記事を参考にさせていただきました。こちらの記事の方が詳しく書いていることもありますので、 そちらも是非参考にしてみてください。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

N+1問題の解決法(Ruby on Rails)

N+1問題とは 1つのテーブルへのSQL発行と。N回の関連デーブルへのSQL発行が発生してしまうこと。 データ量が多い大規模サービスで顕著に低いパフォーマンスが現れてしまう。  対象のモデル N+1問題を確認するモデルは,tag_categoryモデルとtagモデル。 以下の2つのモデルは1対多の関係になっている。 SQL発行のタイミング 例えば以下の処理をコンソールから入力したとする。 Ruby Tag.find(1) このコードでは、Tagsテーブルのレコードからidが1のものを検索しTagモデルのインスタンスを生成している。 関連するモデルの値を生成するSQL Ruby Tag.find(1).tag_category このコードを実行すると。 1. idが1のレコードをTagsテーブルから取得する 2. 検索結果のレコードからtag_catory_idを取得する 3. tag_categorysテーブルから2で検索したtag_category_idのレコードを取り出す 4. 検索したレコードからtag_categoryインスタンスを生成する N+1問題が起こる仕組み ループによってインスタンスを複数生成する場合にN+1問題が発生する。 Ruby Tag.limit(5).each do |tag| tag.tag_category end 以下のコードを実行すると、 1. Tagテーブルから5件のレコードを取得する 2. ブロック内で書くTagインスタンスに基づくtag_categoryインスタンスを取得するループ処理を行う よって、このコードでは5+1回SQLの発行が行われN+1問題が発生している。 N+1問題を解消する方法 アクティブレコードで以下のメソッドを使用してSQLを発行する。 1. joins 2. left_outer_joins 3. eager_load 4. preload 5. includes
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

RailsでLIKE検索をする

index.html.erb <%= form_tag(admin_items_path, method: :GET) do %> <%= text_field_tag :search %> <%= submit_tag "検索", class: "btn btn-primary" %> <% end %> hoge_controller.rb def index if params[:search].present? @items = Item.where('name LIKE ?',"%#{params[:search]}%") else @items = Item.all end end
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【AWS】EC2でのデプロイ(自動デプロイ)

目的 AWSのサーバーを利用し、Railsで作成したアプリを公開する。 開発環境 macOS: Big Sur Rubyバージョン: 2.6.5 Railsバージョン: 6.0.0 前提 Webサーバーの設定が完了している。【AWS】EC2でのデプロイ(Webサーバーの設定) 手順 はじめに Gemの導入 Capfileの編集 production.rbの編集 deploy.rbの編集 Unicorn設定ファイルの編集 Nginx設定ファイルの編集 自動デプロイの準備 自動デプロイの実行 アプリ修正から自動デプロイの流れ はじめに 今回は自動デプロイを実装していきます! これまで手動で行っていたデプロイ作業を、ローカルのターミナルからのコマンド1つで行えるようにします。 そのために、自動デプロイツールと呼ばれるものを利用しますが、今回はポピュラーなCapistranoを導入していきます。 Capistranoを利用すればEC2サーバーにログインする必要もなくコマンド1つでデプロイが完了します! Gemの導入 それでは早速始めていきます! まずは、Capistranoを利用するためのGemをインストールします。 Gemfile #省略 group :development, :test do gem 'capistrano' gem 'capistrano-rbenv' gem 'capistrano-bundler' gem 'capistrano-rails' gem 'capistrano3-unicorn' end #省略 ターミナル(ローカル) % bundle install ターミナル(ローカル) % bundle exec cap install これでインストールできました! Capfileの編集 続いて、Capistrano全体の設定をしているCapfileを編集します。 Capfileでは、Capistrano関連のライブラリのうちどれを読み込むかを指定できます。 Capistranoの機能を提供するコードはいくつかのライブラリに分かれています。そのため、Capistranoを動かすにはいくつかのライブラリを読み込む必要があります。 Capfile require "capistrano/setup" require "capistrano/deploy" require 'capistrano/rbenv' require 'capistrano/bundler' require 'capistrano/rails/assets' require 'capistrano/rails/migrations' require 'capistrano3/unicorn' Dir.glob("lib/capistrano/tasks/*.rake").each { |r| import r } 「require」によって引数としておかれた文字列が指すディレクトリが読み込まれ、その中にデプロイに際して必要な動作がひととおり記述されています。 production.rbの編集 続いて、デプロイについての設定を記載するファイルを編集します。 production.rbは、デプロイについての設定を書くファイルです。 GitHubへの接続に必要なsshキーの指定、デプロイ先のサーバのドメイン、AWSサーバへのログインユーザー名、サーバにログインしてからデプロイのために何をするか、といった設定を記載します。 また、deploy.rb、staging.rbも同様の役割をするファイルです。 config/deploy/production.rb server '用意したElastic IP', user: 'ec2-user', roles: %w{app db web} deploy.rbの編集 次は、deploy.rbの設定です。 このファイルには、production環境、staging環境どちらにも当てはまる設定を記述することとなります。 それでは、編集していきます! config/deploy.rb # capistranoのバージョンを記載。固定のバージョンを利用し続け、バージョン変更によるトラブルを防止する lock 'Capistranoのバージョン' # Capistranoのログの表示に利用する set :application, 'アプリ名' # どのリポジトリからアプリをpullするかを指定する set :repo_url, 'git@github.com:Githubのユーザー名/レポジトリ名.git' # バージョンが変わっても共通で参照するディレクトリを指定 set :linked_dirs, fetch(:linked_dirs, []).push('log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'vendor/bundle', 'public/system', 'public/uploads') set :rbenv_type, :user set :rbenv_ruby, 'このアプリで使用しているrubyのバージョン' # どの公開鍵を利用してデプロイするか set :ssh_options, auth_methods: ['publickey'], keys: ['~/.ssh/キーペア名.pem'] # プロセス番号を記載したファイルの場所 set :unicorn_pid, -> { "#{shared_path}/tmp/pids/unicorn.pid" } # Unicornの設定ファイルの場所 set :unicorn_config_path, -> { "#{current_path}/config/unicorn.rb" } set :keep_releases, 5 # デプロイ処理が終わった後、Unicornを再起動するための記述 after 'deploy:publishing', 'deploy:restart' namespace :deploy do task :restart do invoke 'unicorn:restart' end end 「Capistranoのバージョン」は、Gemfile.lockに記載されています。 Unicorn設定ファイルの編集 続いてUnicorn設定ファイルの編集です。 手動デプロイの時と比べ、自動デプロイ時にはRailsアプリのディレクトリが1段階深くなるため、数ヶ所変更を加える必要があります。 config/unicorn.rb #サーバ上でのアプリコードが設置されているディレクトリを変数に入れておく app_path = File.expand_path('../../../', __FILE__) #アプリサーバの性能を決定する worker_processes 1 #アプリの設置されているディレクトリを指定 working_directory "#{app_path}/current" # 「current」を指定 #Unicornの起動に必要なファイルの設置場所を指定 pid "#{app_path}/shared/tmp/pids/unicorn.pid" # 「shared」の中を参照するよう変更 #ポート番号を指定 listen "#{app_path}/shared/tmp/sockets/unicorn.sock" # 「shared」の中を参照するよう変更 #エラーのログを記録するファイルを指定 stderr_path "#{app_path}/shared/log/unicorn.stderr.log" # 「shared」の中を参照するよう変更 #通常のログを記録するファイルを指定 stdout_path "#{app_path}/shared/log/unicorn.stdout.log" # 「shared」の中を参照するよう変更 #省略 Nginx設定ファイルの編集 同じく、Nginxの設定ファイルも編集します。 ターミナル(EC2内で実行) $ sudo vim /etc/nginx/conf.d/rails.conf vimコマンドで編集するので、まずは「i」と打ち込んで入力モードに切り替えます。 /etc/nginx/conf.d/rails.conf upstream app_server { # Unicornと連携させるための設定 server unix:/var/www/リポジトリ名/shared/tmp/sockets/unicorn.sock; } # {}で囲った部分をブロックと呼ぶ。サーバの設定ができる server { # このプログラムが接続を受け付けるポート番号 listen 80; # 接続を受け付けるリクエストURL ここに書いていないURLではアクセスできない server_name Elastic IP; # クライアントからアップロードされてくるファイルの容量の上限を2ギガに設定。デフォルトは1メガなので大きめにしておく client_max_body_size 2g; # 接続が来た際のrootディレクトリ root /var/www/リポジトリ名/current/public; # assetsファイル(CSSやJavaScriptのファイルなど)にアクセスが来た際に適用される設定 location ^~ /assets/ { gzip_static on; expires max; add_header Cache-Control public; root /var/www/リポジトリ名/current/public; } try_files $uri/index.html $uri @unicorn; location @unicorn { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass http://app_server; } error_page 500 502 503 504 /500.html; } 入力を終えたら「escキー」→「:wq」の順で実行し、保存します! Nginxの設定を変更したら、忘れずに再読込・再起動をしましょう。 ターミナル(EC2内で実行) [ec2-user@ip-172-31-25-189 ~]$ sudo systemctl reload nginx ターミナル(EC2内で実行) [ec2-user@ip-172-31-25-189 ~]$ sudo systemctl restart nginx 以上でNginx設定ファイルの編集は完了です! 自動デプロイの準備 ここからは自動デプロイの準備を行っていきます。 まずデータベースの状態を確認します。データベースが立ち上がっていないとデプロイが失敗するためです。 ターミナル(EC2内で実行) [ec2-user@ip-172-31-25-189 ~]$ sudo systemctl status mariadb ここでactiveになっていない場合はsudo systemctl start mariadbを実行します。 次に、unicornのプロセスをkillします。 すでにunicornのサーバーが立ち上がっている状態で自動デプロイをすると、二重でサーバーを立ち上げることになるためです。 まずは、プロセスを確認します。 ターミナル(EC2内で実行) [ec2-user@ip-172-31-23-189 <リポジトリ名>]$ ps aux | grep unicorn 続いて、プロセスをkillします。 ターミナル(EC2内で実行) [ec2-user@ip-172-31-23-189 <リポジトリ名>]$ kill プロセス番号 以上で自動デプロイの準備は完了です! 自動デプロイの実行 それでは実際に、自動デプロイを実行します! ターミナル(ローカル) % bundle exec cap production deploy 上記コマンドを実行しエラーが表示されずに完了したら自動デプロイは完了です。 アプリ修正から自動デプロイの流れ アプリの修正を行った際、自動デプロイをする前にやるべき事は下記の通りです。 状況 自動デプロイ前にやること VSCodeを修正した場合 変更点をリモートリポジトリにcommit→pushする データベース関連の内容を修正した場合 本番環境で「rails db:drop RAILS_ENV=production」「rails db:create RAILS_ENV=production」を実行 (※実行する際、「DISABLE_DATABASE_ENVIRONMENT_CHECK=1」というオプションが必要) Nginxを修正した場合 「sudo systemctl restart nginx」を実行 再度自動デプロイを実行する場合 プロセスをkillした上で「bundle exec cap production deploy」を実行 最後に 以上で、自動デプロイの実装は完了です。 では。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rails現場に入ってわからなかったコードまとめ

はじめに 内容は、タイトルの通りになります。 結構Rubyの学習に近い内容になっています。 : : ::を使用することで、クラスを参照・呼び出すことができる。 呼び出したいクラス class V2::Hoge end 呼び出す時 def hoge run(V2::Hoge) end キーワード引数 キーワード引数を使用することで、値に引数名を指定して、渡すことできる。 def hello(name: ) name end p hello(name: "hello") => hello **(変数名) キーワード引数の書き方の一つ。 定義に存在しない値をハッシュオブジェクトとして受け取ることができる。 def hoge(a: 0,**num) [a,num] end p hoge(a: 1,x:10) => [1,{:x=>10}] attr_reader インスタンス変数読み取り用メソッドが定義できる このようにインスタンス変数を読み取るだけのメソッドを簡略化できるのが、attr_reader def name @name end attr_readerメソッドを使用したやり方 attr_reader :name 同じ内容の意味になる。 reject 各要素やブロックに対して、偽であったものに対して、処理を行い、配列として返す。 (1..6).reject {|i| i % 2 == 0 } # => [1, 3, 5] Ruby 3.0.0 リファレンスマニュアル map(&: ) 簡略系 普通の書き方 hoge.map{|i| i.length) map(&:)を用いた書き方 hoge.map(&:length) nonzero 0の時にnilを返しそれ以外の時は、selfを返す。 0.nonzero? => nil 10.nonzero? => 10 まとめ まだまだ、わからないコード・書き方がたくさんあるので、随時更新していこうと思います。 参考記事 Ruby on Railsの現場でよく見る書き方【実例あり】 Rubyのキーワード引数はシンボルっぽく定義するけど、シンボルそのものではない、という話 Ruby 3.0.0 リファレンスマニュアル
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

RAILS_ENV=production rails db:create db:migrate コマンドがエラーになる時の対処法

Railsアプリのpriduction環境用のデータベースを作成するときに、RAILS_ENV=production rails db:create db:migrateコマンドを実行したのですがエラーが発生しました。 $ RAILS_ENV=production rails db:create db:migrate FATAL:  Peer authentication failed for user "test_2" Couldn't create 'hello_rails_production' database. Please check your configuration. rails aborted! PG::ConnectionBad: FATAL:  Peer authentication failed for user "test_2" /home/horikoshi5/hello_rails/bin/rails:9:in `<top (required)>' /home/horikoshi5/hello_rails/bin/spring:15:in `<top (required)>' bin/rails:3:in `load' bin/rails:3:in `<main>' Tasks: TOP => db:create (See full trace by running task with --trace)   これを解決するには、/etc/postgresql/11/main/pg_hba.confファイル(11の所は入っているpostgresqlのバージョンによって異なります)の local   all             all                                     peer を下記のように変更すれ必要があります。 local   all             all                                     md5   そして最後にpostgresqlを再起動すれば完了です。 $ sudo systemctl restart postgresql.service  参考 [https://ryotatake.hatenablog.com/entry/2019/05/03/postgresql_peer_authentication_failed:title]
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Ruby on Rails] N+1問題の解決法(joinsメソッド編)

はじめに 今回ポートフォリオ(以後PF)制作で、 日本各地の名所を投稿できるサイトを制作しました。 実際に製作したサイトと、コード(GitHub)は下記のURLからご覧ください。 ・サイトURL : https://japansiteinfo.com (今後予告なく公開停止する場合があります。ご了承ください。) ・GitHubのURL : https://github.com/yuta-pharmacy2359/dwc_JapanSiteInfo_app 今回は前回も取り上げた「N+1問題」に関して、includesメソッドで解決できないものについて joinsメソッドを用いた解決法を紹介したいと思います。 本題 1. 「N+1問題」と前回のおさらい 「N+1問題」とは、「データベースからデータを取り出す際、不要なSQLが発行される」ことで、 パフォーマンスの低下を招くため、実際のサイトでは解決することが必要不可欠となります。 前回の記事 (https://qiita.com/yuta-pharmacy2359/items/61cff1aed171fedeff6e) では includesメソッドによる解決法を紹介しました。 基本的に、「単に2つ以上のテーブルの情報を表示するような一覧画面」などは、 以下の式でN+1問題を解決することができます。 モデル名.includes(:関連名) しかし、以下に挙げるような、 「別のテーブルで計算(合計、平均など)した結果を表示する」場合は includesメソッドでは解決することができません。 ・(ユーザー詳細画面における)1人のユーザーが獲得した総いいね数表示 ・(キーワード一覧画面において)1つのキーワードにおけるスポット評価の平均 ・ランキング機能(ユーザー1人ごとの総獲得いいね数)における1人のユーザーの総いいね数表示 ・ランキング機能(ユーザー1人ごとの総獲得いいね数)における1人のユーザーの総スポット数表示 ・フォロー数、フォロワー数表示 ・(フォロー・フォロワー画面における)各ユーザーの最終更新日表示 今回は上記のうち、「(ユーザー詳細画面における)1人のユーザーが獲得した総いいね数表示」機能におけるN+1問題の解決法を、 joinsメソッド用いて解決していきたいと思います。 2. 実際に発生した問題 当PFでは、ユーザー詳細画面でそのユーザーが獲得した総いいね数を表示しています。 そのカウントの仕組みを模式的に表したのが下図です。 この図の場合、id = 1のユーザーが投稿したスポットのidを外部キーとして持ついいねの数を合計した値を 「1人のユーザーが獲得した総いいね数」として表示しています。 この機能をN+1問題を考慮しないで実装する場合、usersコントローラーおよびshowビューファイルでの記述は以下の通りになります。 (もちろん、記述方法は他にもあると思いますので、あくまで一例とお考えいただければと思います。) users_controller.rb # showアクションのうち、今回の機能に関係のある部分のみ抜粋 def show @user = User.find(params[:id]) @user_all_spots = @user.spots @user_all_favorites_count = 0 @user_all_spots.each do |spot| @user_all_favorites_count += spot.favorites.count end end users/show.html.erb <!--今回の機能に関係のある部分のみ抜粋--> <tr> <td>総いいね数</td> <td class="user-favorite-count-<%= @user.id %>"><%= @user_all_favorites_count %></td> </tr> コントローラーファイルに関して簡単に説明すると、showアクションの中身において 【1行目】 当該のユーザーidのユーザーを選択 【2行目】 対象のユーザー(@user)のスポットを@user_all_spotsに代入 (上図の例では、id=1のユーザーのスポット(id=2,13,28,144,186,207)を代入) 【3行目】 @user_all_favorites_countに0を代入して値をリセット 【4~6行目】 対象のユーザーの各スポットが獲得したいいね数を 順に@user_all_favorites_countに加算していく (上図の例では spot_id=2 => いいね数3 spot_id=13 => いいね数2 spot_id=28 => いいね数1 spot_id=144 => いいね数2 spot_id=186 => いいね数1 spot_id=207 => いいね数3 @user_all_favorites_count=3+2+1+2+1+3=12) となります。【4~6行目】の説明を見て薄々お気づきかと思いますが、 この記述では、以下のようなアクセスが行われています。 User Load (0.2ms) SELECT "users".* FROM "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ? [["id", 1], ["LIMIT", 1]] Spot Load (0.2ms) SELECT "spots".* FROM "spots" WHERE "spots"."user_id" = ? [["user_id", 1]] (0.2ms) SELECT COUNT(*) FROM "favorites" WHERE "favorites"."spot_id" = ? [["spot_id", 2]] (0.2ms) SELECT COUNT(*) FROM "favorites" WHERE "favorites"."spot_id" = ? [["spot_id", 13]] (0.1ms) SELECT COUNT(*) FROM "favorites" WHERE "favorites"."spot_id" = ? [["spot_id", 28]] (0.1ms) SELECT COUNT(*) FROM "favorites" WHERE "favorites"."spot_id" = ? [["spot_id", 144]] (0.1ms) SELECT COUNT(*) FROM "favorites" WHERE "favorites"."spot_id" = ? [["spot_id", 186]] (0.1ms) SELECT COUNT(*) FROM "favorites" WHERE "favorites"."spot_id" = ? [["spot_id", 207]] SQL2行目では、showアクションの【4行目】に則り、 user_id=1の全スポットが呼び出されています。 そしてSQL3行目以降では、showアクションの【5行目】に則り、 user_id=1の各スポットにそれぞれ紐づけられたいいねの情報が呼び出されています。 まさに「N+1問題」が発生している状況ですね。 そして、今回の例ではスポット数が6でしたので、アクセス回数は7で済んでいますが、 極端な例ですが「三度の飯より旅行」なユーザーが1000件、10000件投稿していたとしたら... 想像するだけで頭が痛くなってしまいますね。 それでは、この問題を解決する記述方法を紹介したいと思います。 3. 解決法 users_controller.rb # showアクションのうち、今回の機能に関係のある部分のみ抜粋 def show @user = User.find(params[:id]) @user_all_spots = @user.spots @user_all_favorites_count = @user_all_spots.joins(:favorites).count end 早速usersコントローラーでの記述から紹介しました。(showのビューファイルは変更なし) showアクションの中身において、【1~2行目】は先ほどと同じです。 問題の【3行目】に関して、順を追って説明していきます。 ここで出てきたjoinsメソッドは、「関連するテーブル同士を内部結合するメソッド」です。 基本的な定義は以下の通りです。 モデル名.joins(:関連名) 引数は、includesメソッドと同じく関連名(モデルファイルでhas_many、またはbelongs_toの後ろに記述した名前)ですのでご注意ください。 「結合」とは、一言で言えば「結合条件に従って複数のテーブルを1つのテーブルとして結合させること」です。 そして結合も「内部結合」および「外部結合」の2種類に大別されますが、今回のテーマからそれてしまうため、 詳しい説明は省略させていただきます。 (簡単に言えば、複数のテーブルを1つにした際に、 ・「内部結合」・・・片方のテーブルに情報が入ってない場合、もう片方のテーブルに情報があっても表示されない ・「外部結合」・・・片方のテーブルに情報が入ってない場合でも、もう片方のテーブルの情報があれば、それを表示する です。機会があれば取り上げたいと思います。) ひとまず今回は、下図のようなイメージを持っていただければと思います。 ここで、「spotsテーブルにおけるid」と「favoritesテーブルにおけるspot_id」は同じ内容であることに着目すると、 これら2つのテーブルを結合した際に上図の右側のようにデータが配置され、あたかも 「id=4,16,39...348,371,397のいいねは全てid=1のユーザーに対して付与されたもの」 と捉えることができます。これがミソであり、今まで1人のユーザーが獲得したいいね数をカウントする場合は、 「id=1のユーザーが投稿したのはid=2,13,28,144,186,207のスポットである。そしてそれぞれのスポットが獲得したいいね数は3,2,1,2,1,3なので、id=1のユーザーが獲得した総いいね数は12である。」 と考える必要があったのが、 「結合後の旧spotテーブル側において、user_id=1であるレコード数は12なので、id=1のユーザーが獲得した総いいね数は12である。」 と捉えることができるようになります。 (要は「手順を挟まずにダイレクトに集計できるようになる」ということです。) あとは結合後のレコード数を数えれば良いので、countメソッドを用いればOKです。 この記述に変更し、再度ターミナルのログを確認すると、 User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] (0.2ms) SELECT COUNT(*) FROM "spots" INNER JOIN "favorites" ON "favorites"."spot_id" = "spots"."id" WHERE "spots"."user_id" = ? [["user_id", 1]] 無事「N+1問題」を解決することができました。 終わりに 今回は、includesメソッドで「N+1問題」を解決できない機能のうち、「(ユーザー詳細画面における)1人のユーザーが獲得した総いいね数表示機能」について、joinsメソッドを用いてN+1問題を解決しました。 残りの5項目に関しては、joinsメソッドの他にgroupメソッドを使用する必要があります。それに関してはまた記事を上げたいと思っています。 使用画像素材 ・いらすとや(https://www.irasutoya.com/) ・ぱくたそ(https://www.pakutaso.com/)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【AWS】EC2でのデプロイ(Webサーバーの設定)

目的 AWSのサーバーを利用し、Railsで作成したアプリを公開する。 開発環境 macOS: Big Sur Rubyバージョン: 2.6.5 Railsバージョン: 6.0.0 前提 EC2のRailsが起動している。【AWS】EC2でのデプロイ(EC2のRailsを起動) 手順 はじめに Nginxの導入 Nginx設定ファイルの編集 Unicornの設定変更 「502 but gateway」の対処法 はじめに 今回はNginxの導入を行っていきます! Nginxとは、Webサーバーの一種で、ユーザーのリクエストに対して静的コンテンツのみ取り出し処理を行い、動的コンテンツの生成をアプリケーションサーバに依頼する役割があります。 Nginxの導入 今回は、NginxのNginx1というバージョンを導入します。 ターミナル(EC2内で実行) [ec2-user@ip-172-31-25-189 ~]$ sudo amazon-linux-extras install nginx1 Is this ok [y/d/N]:と出てきたら、yを選択して決定してください。 無事に完了すれば、Nginxがインストールできています。 Nginx設定ファイルの編集 次にNginxが正しく動くように設定します。 ターミナル(EC2内で実行) [ec2-user@ip-172-31-25-189 ~]$ sudo vim /etc/nginx/conf.d/rails.conf ターミナル上でファイルを開けたら次のように編集します。 /etc/nginx/conf.d/rails.conf upstream app_server { # Unicornと連携させるための設定 server unix:/var/www/リポジトリ名/tmp/sockets/unicorn.sock; } # {}で囲った部分をブロックと呼ぶ。サーバの設定ができる server { # このプログラムが接続を受け付けるポート番号 listen 80; # 接続を受け付けるリクエストURL ここに書いていないURLではアクセスできない server_name Elastic IP; # クライアントからアップロードされてくるファイルの容量の上限を2ギガに設定。デフォルトは1メガなので大きめにしておく client_max_body_size 2g; # 接続が来た際のrootディレクトリ root /var/www/リポジトリ名/public; # assetsファイル(CSSやJavaScriptのファイルなど)にアクセスが来た際に適用される設定 location ^~ /assets/ { gzip_static on; expires max; add_header Cache-Control public; } try_files $uri/index.html $uri @unicorn; location @unicorn { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass http://app_server; } error_page 500 502 503 504 /500.html; } 入力を終えたら「escキー」→「:wq」の順で実行し、保存します! 続いてNginxの権限を変更します。 下記コマンドでPOSTメソッドでもエラーが出ないようにします。 ターミナル(EC2内で実行) [ec2-user@ip-172-31-25-189 ~]$ cd /var/lib ターミナル(EC2内で実行) [ec2-user@ip-172-31-25-189 lib]$ sudo chmod -R 775 nginx これで、Nginxの設定が完了しました! 以下のコマンドを実行してNginx設定ファイルを再読み込みして起動します。 ターミナル(EC2内で実行) [ec2-user@ip-172-31-25-189 lib]$ cd ~ ターミナル(EC2内で実行) [ec2-user@ip-172-31-25-189 ~]$ sudo systemctl reload nginx ターミナル(EC2内で実行) [ec2-user@ip-172-31-25-189 ~]$ sudo systemctl start nginx Unicornの設定変更 Nginxを介した処理に変更したため、Unicornの設定も修正します。 config/unicorn.rb #省略 #listen 3000 listen "#{app_path}/tmp/sockets/unicorn.sock" #省略 編集したら、リモートリポジトリへ「commit→push」します! 次は、GitHubの変更点を本番環境へ反映させましょう。 まずは開発中のアプリケーションに移動します。 ターミナル(EC2内で実行) [ec2-user@ip-172-31-25-189 ~]$ cd /var/www/開発中のアプリケーション そしてGitHubの内容をEC2に反映させます。 ターミナル(EC2内で実行) [ec2-user@ip-172-31-23-189 <レポジトリ名>]$ git pull origin master 次は、Unicornを再起動します。 ターミナル(EC2内で実行) [ec2-user@ip-172-31-23-189 <リポジトリ名>]$ ps aux | grep unicorn ターミナル(EC2内で実行) [ec2-user@ip-172-31-23-189 <リポジトリ名>]$ kill プロセス番号 ターミナル(EC2内で実行) [ec2-user@ip-172-31-23-189 <リポジトリ名>]$ RAILS_SERVE_STATIC_FILES=1 unicorn_rails -c config/unicorn.rb -E production -D ここまでできたら、ブラウザで確認してみます! 「502 but gateway」の対処法 このエラーが出た場合はnginxのlogの確認をし、エラーログを探します! ターミナル(EC2内で実行) [ec2-user@ip-172-31-23-189 <リポジトリ名>]$ sudo less /var/log/nginx/error.log 最後に 以上で、Webサーバーの設定は完了です。 次回は自動デプロイです。【AWS】EC2でのデプロイ(自動デプロイ では。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Windows10にRuby on Rails6.1.3.2を導入する方法

この度、Windows10にRuby on Rails環境を構築したのですが、かなりてこずり8時間くらいかかったので、方法を備忘録として残したいと思います。 作業環境 ・Windows 10 ・Ruby 2.7.3(C:¥Ruby_on_Railsにインストールしています。) ・Rails 6.1.2.3 ・node.js 14.17.1 ・yarn 1.22.10 ・PostgreSQL 13.3 では早速Rubyのインストールから始めましょう。 Rubyのダウンロード まず、こちらからRubyとDevKitをダウンロードします。 Rubyは太字になっているものがおすすめです。 ↑Ruby Devkitはページの下の方にあるので、最新版のインストーラをダウンロードします。 どこにインストールするか聞かれるので、先ほどダウンロードしたRubyフォルダの直下にDevKitフォルダを作成、そこに入れます。 ↑DevKit ↑Rubyフォルダの直下 自分で作成する 続いて、Devkitの設定を行います。 コマンドプロンプトを開いて(windowsキー+s押下 -> cmdと入力)、次のコマンドをひとつづつ順番に打ちます。 >cd C:¥Ruby_on_Rails¥Ruby27_x64¥devkit >ruby dk.rb init >ruby dk.rb install >ruby -v インストールが完了しているとrubyのバージョンが表示されます。 そしてコマンドプロンプトを閉じれば、Rubyのインストールは完了です。 Railsをインストールする 次にRailsをインストールします。 コマンドプロンプトを開いて、 >gem install rails と入力してください。 ralisと間違えないよう注意が必要です。(自分はよく間違えました。) しばらく時間がかかりますが、終わったら、 >rails -v と入力して、Rails 6.1.3.2(バージョンによって多少の違いあり)と出ればRailsのインストールは完了です。 node.jsとyarnのインストール 次にnode.jsとyarnをインストールします。インストールが続きますが、もう少しですので頑張りましょう。 まずはnode.jsからです。これは公式のHPからダウンロードできます。場所はデフォルトのままで大丈夫です。 ↑node.js 終わったら、コマンドプロンプトを開いて >node -v >npm -v と入力して、バージョンを確認したら、node.jsのインストールは完了です。 続いてyarnをインストールします。 コマンドプロンプトで >npm install -g yarn >yarn -v >yarn init とそれぞれ入力してください。 yarnのバージョンなどが表示されていればインストールは完了です。 PostgreSQLのインストール 最後のインストールです。DBであるPostgreSQL(ぽすとぐれすきゅーえる)をインストールしていきます。 PostgreSQLの公式サイトからwindows版のインストーラを入手します。 ↑赤丸のリンクをクリック そしてインストーラの指示に従ってインストールします。(場所はデフォルトで大丈夫です。) 次にパスを通します。 まず、スタート -> 設定 -> システム -> 詳細情報 -> システムの詳細設定(下のほうにある)をクリックします。 次に、システムのプロパティの下の方にある環境変数をクリック。 画面下半分のシステム環境変数のPathを選択、ない場合は作成します。 その中にPostgreSQLのbinフォルダのパスを記載します。 PostgreSQLのbinフォルダを見つけることができない場合は、エクスプローラーからCドライブを検索すると見つかります。 ではバージョンを確認します。 コマンドプロンプトを開いて、 >psql --version と入力してみてください。 エラーが出た場合は、パスが間違っている可能性があります。 これで、PostgreSQLのインストールは終了です。 PostgreSQLでデータベースを作成する 必要なもののインストールが終了したので、今度はデータベースを作っていきます。 まず、コマンドプロンプトを開いて、 >psql -U postgres と入力してみてください。 パスワードはPostgreSQLをインストールしたときに設定したものです。 これはかなりの省略形でロール名を指定しているだけですが、デフォルトで用意されているpostgresという名のデータベースに接続されます。 ちなみに、¥lでデータベース一覧を表示でき、¥qと打てば終了します。 次に自分でデータベースを作成します。 > create database データベース名; で作成できます。作れない場合はスペルミスとか、createの前に半角の空白があるかとか、セミコロン(;)忘れていないかとか確認してみてください。 では、実際に3つのデータベースを作ってみます。 > create database my_database_development; > create database my_database_production; > create database my_database_test; >¥l これで3つのデータベースが作られ表示されているはずです。 これでPostgreSQLの操作はこれでおしまいです。 実際に運用する際はテーブルの作成などが必要になってきます。 Railsのアプリを作り、サーバーを立てる ここでは、アプリを作り、ローカルサーバーを立ててみます。 まずRubyフォルダの直下にrailsフォルダを作ります。 (作らなくてもエラーは出ませんが、見やすくするために作ってます。) そしてコマンドプロンプトを開いて、その階層に移動し、アプリを作ります。 >cd C:¥Ruby_on_Rails¥Ruby27-x64¥rails >rails new sample_app sample_appの部分はアプリ名ですので、ご自由にどうぞ。 これで少し待つとrailsフォルダの中にたくさんのファイルが作られていると思います。 次にその中にある3つのファイルを編集します。 まず、sample_app直下のGemfileを以下のように編集します。 2行目のgit文は登録してないとエラーになるかもしれませんので、ご注意ください。 source 'https://rubygems.org' git_source(:github) { |repo| "https://github.com/#{repo}.git" } ruby '2.7.3' # Bundle edge Rails instead: gem 'rails', github: 'rails/rails', branch: 'main' gem 'rails', '~> 6.1.3', '>= 6.1.3.2' # Use sqlite3 as the database for Active Record gem 'pg', '1.2.3' # Use Puma as the app server gem 'puma', '~> 5.0' # Use SCSS for stylesheets gem 'sass-rails', '>= 6' # Transpile app-like JavaScript. Read more: https://github.com/rails/webpacker gem 'webpacker', '~> 5.0' # Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks gem 'turbolinks', '~> 5' # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder gem 'jbuilder', '~> 2.7' # Use Redis adapter to run Action Cable in production # gem 'redis', '~> 4.0' # Use Active Model has_secure_password # gem 'bcrypt', '~> 3.1.7' # Use Active Storage variant # gem 'image_processing', '~> 1.2' # Reduces boot times through caching; required in config/boot.rb gem 'bootsnap', '>= 1.4.4', require: false group :development, :test do # Call 'byebug' anywhere in the code to stop execution and get a debugger console gem 'sqlite3','~> 1.4' gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] end group :development do # Access an interactive console on exception pages or by calling 'console' anywhere in the code. gem 'web-console', '>= 4.1.0' # Display performance information such as SQL time and flame graphs for each request in your browser. # Can be configured to work on production as well see: https://github.com/MiniProfiler/rack-mini-profiler/blob/master/README.md gem 'rack-mini-profiler', '~> 2.0' end group :test do # Adds support for Capybara system testing and selenium driver gem 'capybara', '>= 3.26' gem 'selenium-webdriver' # Easy installation and use of web drivers to run system tests with browsers gem 'webdrivers' end group :production do gem 'pg', '1.2.3' end # Windows does not include zoneinfo files, so bundle the tzinfo-data gem gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] 次に、同じくsample_app直下のconfigフォルダの中にあるdatabase.ymlを以下のように編集します。 # SQLite. Versions 3.8.0 and up are supported. # gem install sqlite3 # # Ensure the SQLite 3 gem is defined in your Gemfile # gem 'sqlite3' # default: &default adapter: postgresql pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> timeout: 5000 username: postgres password: 設定したパスワード development: <<: *default database: my_database_development # Warning: The database defined as "test" will be erased and # re-generated from your development database when you run "rake". # Do not set this db to the same as development or production. test: <<: *default database: my_database_test production: <<: *default database: my_database_production ここでは、先ほど登場したデータベースの名前が出てきてますね。 空白は半角の空白2つ分あけてください。 最後にconfig/environments/production.rbをテキストファイルで開いて編集します。 (31行目あたり) config.assets.compile = true 人によりますが、sample_app直下のbinフォルダのそれぞれのファイルの1行目のrubyの文字の後にバージョンが入っている場合は消しておいた方がいいです。 そして、コマンドプロンプトで次のコマンドを入力します。 >rails webpacker:install >rails s これで、おそらくサーバーが立ったのでlocalhost:3000にアクセスしてみましょう。 この画面が出ていれば、サーバーの作成は成功しています。 これでローカルの開発環境は整いました。 この後は、htmlやcssなどをいじってこの画面を自分の作成したデザインに変えていきます。(本記事では取り扱いません。) Herokuにデプロイ ここまでお疲れさまでした。 最後にHerokuにデプロイする方法を書きます。 なお、gitへの登録とHerokuへの登録は済ませてあるものとします。 それぞれのHPからメアドやパスワードを打てば登録できます。 必要なコマンドをダーッと書いていきます。 1回目 >cd C:¥Ruby_on_Rails¥Ruby27-x64¥rails¥sample_app >git --version >heroku --version >rake db:create >rake db:migrate >git init >git add -A >git commit -m "first commit" >heroku login >heroku create >git push heroku main 2回目以降 >git add -A >git commit -m "second commit" >git push heroku main 以上になります。方法を書くといいつつ、コマンドだけになり申し訳ございません。 Herokuとssh接続するコマンドがいくつかあったのですが、思い出せませんので気になった方は調べてみてください。 最後に 最後まで読んでくださり、誠にありがとうございました。そしてお疲れ様です。 見づらい部分も多く、さらに私もまだ導入しただけで詳しくないので説明がほとんどできておらず申し訳ないと思います。 これからもいろいろと書いていこうと思いますので、どうぞよろしくお願いいたします。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

whereで複数条件でカラムを合計する

現在作っているダイエットのためのカロリー計算アプリですが、 トップページの本日食べた栄養素とカロリー合計を表示するようにしています。 集計するには user_id別 カロリー別 同一日付内で合計しています ■id別日付別という2重条件についての処理 .where(×××××: day).where(×××××: current_user.id)     ※:カラム名 ■合計します .sum(:×××××)     ※:カラム名 ■小数点以下の計算が多いので小数点3桁以下を四捨五入 .round(3) でき上がったのは以下 [circle_contoroller.rb] @calorie = CookedFood.where(meal_date: day).where(user_id: current_user.id).sum(:calorie).round(3) @protein = CookedFood.where(meal_date: day).where(user_id: current_user.id).sum(:protein).round(3) @carbohydrate = CookedFood.where(meal_date: day).where(user_id: current_user.id).sum(:carbohydrate).round(3) @sugar_content = CookedFood.where(meal_date: day).where(user_id: current_user.id).sum(:sugar_content).round(3) @fiber = CookedFood.where(meal_date: day).where(user_id: current_user.id).sum(:fiber).round(3) @salt = CookedFood.where(meal_date: day).where(user_id: current_user.id).sum(:salt).round(3) @lipid = CookedFood.where(meal_date: day).where(user_id: current_user.id).sum(:lipid).round(3) @meal_quantity = CookedFood.where(meal_date: day).where(user_id: current_user.id).sum(:meal_quantity)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

mysql2をbundle installできないし、brew info opensslでも解決できない

どうしたの? 状況: - Gemfileにmysql2をbundle installしようとしたところで、インストールエラーが発生。 やりたいこと: - デプロイ用のDBをPostgreSQLからMySQLに変更したく、まずはGemをインストールしたい。 環境: - Rails 6.0.2 - Ruby 2.6.5 - gem mysql2(バージョン指定なし) - AWSのEC2インスタンス内で操作(SSHを使用してインスタンスに接続) もう少し説明 mysql2 gemをGemfileに記述し、bundle installをすると以下が発生 ターミナル $ bundle Your Gemfile lists the gem devise (>= 0) more than once. You should probably keep only one of them. Remove any duplicate entries and specify the gem only once. While it's not a problem now, it could cause errors if you change the version of one of them later. Your Gemfile lists the gem omniauth-google-oauth2 (>= 0) more than once. You should probably keep only one of them. Remove any duplicate entries and specify the gem only once. While it's not a problem now, it could cause errors if you change the version of one of them later. Your Gemfile lists the gem dotenv-rails (>= 0) more than once. You should probably keep only one of them. Remove any duplicate entries and specify the gem only once. While it's not a problem now, it could cause errors if you change the version of one of them later. Fetching gem metadata from https://rubygems.org/............ Resolving dependencies... Using rake 13.0.1 Using concurrent-ruby 1.1.6 Using i18n 1.8.3 Using minitest 5.14.1 Using thread_safe 0.3.6 Using tzinfo 1.2.7 Using zeitwerk 2.3.0 Using activesupport 6.0.3.1 Using builder 3.2.4 Using erubi 1.9.0 Using mini_portile2 2.4.0 Using nokogiri 1.10.9 Using rails-dom-testing 2.0.3 Using crass 1.0.6 Using loofah 2.6.0 Using rails-html-sanitizer 1.3.0 Using actionview 6.0.3.1 Using rack 2.2.3 Using rack-test 1.1.0 Using actionpack 6.0.3.1 Using nio4r 2.5.2 Using websocket-extensions 0.1.5 Using websocket-driver 0.7.2 Using actioncable 6.0.3.1 Using globalid 0.4.2 Using activejob 6.0.3.1 Using activemodel 6.0.3.1 Using activerecord 6.0.3.1 Using mimemagic 0.3.10 Using marcel 0.3.3 Using activestorage 6.0.3.1 Using mini_mime 1.0.2 Using mail 2.7.1 Using actionmailbox 6.0.3.1 Using actionmailer 6.0.3.1 Using actiontext 6.0.3.1 Using arbre 1.2.1 Using formtastic 3.1.5 Using formtastic_i18n 0.6.0 Using has_scope 0.7.2 Using method_source 1.0.0 Using thor 1.0.1 Using railties 6.0.3.1 Using responders 3.0.1 Using inherited_resources 1.11.0 Using jquery-rails 4.4.0 Using kaminari-core 1.2.1 Using kaminari-actionview 1.2.1 Using kaminari-activerecord 1.2.1 Using kaminari 1.2.1 Using polyamorous 2.3.2 Using ransack 2.3.2 Using ffi 1.13.1 Using sassc 2.4.0 Using sprockets 4.0.2 Using sprockets-rails 3.2.1 Using tilt 2.0.10 Using sassc-rails 2.1.2 Using activeadmin 2.7.0 Using execjs 2.7.0 Using autoprefixer-rails 9.7.6 Using bcrypt 3.1.13 Using bindex 0.8.1 Using msgpack 1.3.3 Using bootsnap 1.4.6 Using popper_js 1.16.0 Using bootstrap 4.5.0 Using bundler 2.2.20 Using byebug 11.1.3 Using coderay 1.1.3 Using orm_adapter 0.5.0 Using warden 1.2.8 Using devise 4.7.2 Using dotenv 2.7.6 Using dotenv-rails 2.7.6 Using multipart-post 2.1.1 Using faraday 1.0.1 Using hashie 4.1.0 Using jbuilder 2.10.0 Using jwt 2.2.1 Using kgio 2.11.4 Using libv8 7.3.492.27.1 (x86_64-linux) Using rb-fsevent 0.10.4 Using rb-inotify 0.10.1 Using ruby_dep 1.5.0 Using listen 3.1.5 Using mini_racer 0.2.14 Using multi_json 1.14.1 Using multi_xml 0.6.0 Fetching mysql2 0.5.3 Installing mysql2 0.5.3 with native extensions Gem::Ext::BuildError: ERROR: Failed to build gem native extension. current directory: /home/tako_zhangyu/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mysql2-0.5.3/ext/mysql2 /home/tako_zhangyu/.rbenv/versions/2.6.5/bin/ruby -I /home/tako_zhangyu/.rbenv/versions/2.6.5/lib/ruby/2.6.0 -r ./siteconf20210620-23114-pervwr.rb extconf.rb --with-ldflags\=-L/usr/local/opt/openssl@1.1/lib --with-cppflags\=-I/usr/local/opt/openssl@1.1/include checking for rb_absint_size()... yes checking for rb_absint_singlebit_p()... yes checking for rb_wait_for_single_fd()... yes checking for -lmysqlclient... no ----- mysql client is missing. You may need to 'sudo apt-get install libmariadb-dev', 'sudo apt-get install libmysqlclient-dev' or 'sudo yum install mysql-devel', and try again. ----- *** 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=/home/tako_zhangyu/.rbenv/versions/2.6.5/bin/$(RUBY_BASE_NAME) --with-mysql-dir --without-mysql-dir --with-mysql-include --without-mysql-include=${mysql-dir}/include --with-mysql-lib --without-mysql-lib=${mysql-dir}/lib --with-mysql-config --without-mysql-config --with-mysql-dir --without-mysql-dir --with-mysql-include --without-mysql-include=${mysql-dir}/include --with-mysql-lib --without-mysql-lib=${mysql-dir}/lib --with-mysqlclientlib --without-mysqlclientlib To see why this extension failed to compile, please check the mkmf.log which can be found here: /home/tako_zhangyu/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/extensions/x86_64-linux/2.6.0/mysql2-0.5.3/mkmf.log extconf failed, exit code 1 Gem files will remain installed in /home/tako_zhangyu/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mysql2-0.5.3 for inspection. Results logged to /home/tako_zhangyu/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/extensions/x86_64-linux/2.6.0/mysql2-0.5.3/gem_make.out An error occurred while installing mysql2 (0.5.3), and Bundler cannot continue. Make sure that `gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/'` succeeds before bundling. In Gemfile: mysql2 立ち向かう ひとまず以下のエラー文で検索をかけてみる Make sure that `gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/'` succeeds before bundling. 以下のコマンドで解決というような記事がたくさんあったが、まずssh内にbrewがなかったので実行できず ターミナル $ brew info openssl 以下コマンドでbrewをインストール ターミナル $ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)" PATHを2つ通す ターミナル $ echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"' >> /home/tako_zhangyu/.bash_profile $ eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" Homebrewがインストールされているかを確認する意味を込めて以下を実行 ターミナル $ brew -v Homebrew 3.1.12 バージョンが表示されたのでOK 以下を実行 ターミナル $ brew info openssl openssl@1.1: stable 1.1.1k (bottled) 表示された。 別ルートの解決 ここからは多くの記事のように以下コマンドを打つなどの解決策があると思いますが ターミナル $ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl@1.1/lib --with-cppflags=-I/usr/local/opt/openssl@1.1/include" なんやかんやで違うルートで解決したので記録します。 最初のエラー文の中にある以下の記述を実行してみる ----- mysql client is missing. You may need to 'sudo apt-get install libmariadb-dev', 'sudo apt-get install libmysqlclient-dev' or 'sudo yum install mysql-devel', and try again. ----- 結果的に有効だったのは以下コマンドのみ ターミナル $ sudo yum install mysql-devel 読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd 依存性の解決をしています 〜〜〜〜省略〜〜〜〜 インストール: mariadb-devel.x86_64 1:5.5.68-1.amzn2 依存性関連をインストールしました: mariadb-libs.x86_64 1:5.5.68-1.amzn2 完了しました! bundle installを実行 ターミナル $ bundle ~~~~省略~~~~ Bundle complete! 26 Gemfile dependencies, 109 gems now installed. Use `bundle info [gemname]` to see where a bundled gem is installed. できた
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

mysql2をbundle installできないし、brew info opensslも動かない

どうしたの? 状況: - Gemfileにmysql2をbundle installしようとしたところで、インストールエラーが発生。 - ググると$ brew info opensslを勧められるも動かない やりたいこと: - デプロイ用のDBをPostgreSQLからMySQLに変更したく、まずはGemをインストールしたい。 環境: - Rails 6.0.2 - Ruby 2.6.5 - gem mysql2(バージョン指定なし) - AWSのEC2インスタンス内で操作(SSHを使用してインスタンスに接続) もう少し説明 mysql2 gemをGemfileに記述し、bundle installをすると以下が発生 ターミナル $ bundle Your Gemfile lists the gem devise (>= 0) more than once. You should probably keep only one of them. Remove any duplicate entries and specify the gem only once. While it's not a problem now, it could cause errors if you change the version of one of them later. Your Gemfile lists the gem omniauth-google-oauth2 (>= 0) more than once. You should probably keep only one of them. Remove any duplicate entries and specify the gem only once. While it's not a problem now, it could cause errors if you change the version of one of them later. Your Gemfile lists the gem dotenv-rails (>= 0) more than once. You should probably keep only one of them. Remove any duplicate entries and specify the gem only once. While it's not a problem now, it could cause errors if you change the version of one of them later. Fetching gem metadata from https://rubygems.org/............ Resolving dependencies... Using rake 13.0.1 Using concurrent-ruby 1.1.6 Using i18n 1.8.3 Using minitest 5.14.1 Using thread_safe 0.3.6 Using tzinfo 1.2.7 Using zeitwerk 2.3.0 Using activesupport 6.0.3.1 Using builder 3.2.4 Using erubi 1.9.0 Using mini_portile2 2.4.0 Using nokogiri 1.10.9 Using rails-dom-testing 2.0.3 Using crass 1.0.6 Using loofah 2.6.0 Using rails-html-sanitizer 1.3.0 Using actionview 6.0.3.1 Using rack 2.2.3 Using rack-test 1.1.0 Using actionpack 6.0.3.1 Using nio4r 2.5.2 Using websocket-extensions 0.1.5 Using websocket-driver 0.7.2 Using actioncable 6.0.3.1 Using globalid 0.4.2 Using activejob 6.0.3.1 Using activemodel 6.0.3.1 Using activerecord 6.0.3.1 Using mimemagic 0.3.10 Using marcel 0.3.3 Using activestorage 6.0.3.1 Using mini_mime 1.0.2 Using mail 2.7.1 Using actionmailbox 6.0.3.1 Using actionmailer 6.0.3.1 Using actiontext 6.0.3.1 Using arbre 1.2.1 Using formtastic 3.1.5 Using formtastic_i18n 0.6.0 Using has_scope 0.7.2 Using method_source 1.0.0 Using thor 1.0.1 Using railties 6.0.3.1 Using responders 3.0.1 Using inherited_resources 1.11.0 Using jquery-rails 4.4.0 Using kaminari-core 1.2.1 Using kaminari-actionview 1.2.1 Using kaminari-activerecord 1.2.1 Using kaminari 1.2.1 Using polyamorous 2.3.2 Using ransack 2.3.2 Using ffi 1.13.1 Using sassc 2.4.0 Using sprockets 4.0.2 Using sprockets-rails 3.2.1 Using tilt 2.0.10 Using sassc-rails 2.1.2 Using activeadmin 2.7.0 Using execjs 2.7.0 Using autoprefixer-rails 9.7.6 Using bcrypt 3.1.13 Using bindex 0.8.1 Using msgpack 1.3.3 Using bootsnap 1.4.6 Using popper_js 1.16.0 Using bootstrap 4.5.0 Using bundler 2.2.20 Using byebug 11.1.3 Using coderay 1.1.3 Using orm_adapter 0.5.0 Using warden 1.2.8 Using devise 4.7.2 Using dotenv 2.7.6 Using dotenv-rails 2.7.6 Using multipart-post 2.1.1 Using faraday 1.0.1 Using hashie 4.1.0 Using jbuilder 2.10.0 Using jwt 2.2.1 Using kgio 2.11.4 Using libv8 7.3.492.27.1 (x86_64-linux) Using rb-fsevent 0.10.4 Using rb-inotify 0.10.1 Using ruby_dep 1.5.0 Using listen 3.1.5 Using mini_racer 0.2.14 Using multi_json 1.14.1 Using multi_xml 0.6.0 Fetching mysql2 0.5.3 Installing mysql2 0.5.3 with native extensions Gem::Ext::BuildError: ERROR: Failed to build gem native extension. current directory: /home/tako_zhangyu/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mysql2-0.5.3/ext/mysql2 /home/tako_zhangyu/.rbenv/versions/2.6.5/bin/ruby -I /home/tako_zhangyu/.rbenv/versions/2.6.5/lib/ruby/2.6.0 -r ./siteconf20210620-23114-pervwr.rb extconf.rb --with-ldflags\=-L/usr/local/opt/openssl@1.1/lib --with-cppflags\=-I/usr/local/opt/openssl@1.1/include checking for rb_absint_size()... yes checking for rb_absint_singlebit_p()... yes checking for rb_wait_for_single_fd()... yes checking for -lmysqlclient... no ----- mysql client is missing. You may need to 'sudo apt-get install libmariadb-dev', 'sudo apt-get install libmysqlclient-dev' or 'sudo yum install mysql-devel', and try again. ----- *** 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=/home/tako_zhangyu/.rbenv/versions/2.6.5/bin/$(RUBY_BASE_NAME) --with-mysql-dir --without-mysql-dir --with-mysql-include --without-mysql-include=${mysql-dir}/include --with-mysql-lib --without-mysql-lib=${mysql-dir}/lib --with-mysql-config --without-mysql-config --with-mysql-dir --without-mysql-dir --with-mysql-include --without-mysql-include=${mysql-dir}/include --with-mysql-lib --without-mysql-lib=${mysql-dir}/lib --with-mysqlclientlib --without-mysqlclientlib To see why this extension failed to compile, please check the mkmf.log which can be found here: /home/tako_zhangyu/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/extensions/x86_64-linux/2.6.0/mysql2-0.5.3/mkmf.log extconf failed, exit code 1 Gem files will remain installed in /home/tako_zhangyu/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mysql2-0.5.3 for inspection. Results logged to /home/tako_zhangyu/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/extensions/x86_64-linux/2.6.0/mysql2-0.5.3/gem_make.out An error occurred while installing mysql2 (0.5.3), and Bundler cannot continue. Make sure that `gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/'` succeeds before bundling. In Gemfile: mysql2 立ち向かう ひとまず以下のエラー文で検索をかけてみる Make sure that `gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/'` succeeds before bundling. 以下のコマンドで解決というような記事がたくさんあったが、まずssh内にbrewがなかったので実行できず ターミナル $ brew info openssl 以下コマンドでbrewをインストール ターミナル $ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)" PATHを2つ通す ターミナル $ echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"' >> /home/tako_zhangyu/.bash_profile $ eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" Homebrewがインストールされているかを確認する意味を込めて以下を実行 ターミナル $ brew -v Homebrew 3.1.12 バージョンが表示されたのでOK 以下を実行 ターミナル $ brew info openssl openssl@1.1: stable 1.1.1k (bottled) 表示された。 別ルートの解決 ここからは多くの記事のように以下コマンドを打つなどの解決策があると思いますが ターミナル $ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl@1.1/lib --with-cppflags=-I/usr/local/opt/openssl@1.1/include" なんやかんやで違うルートで解決したので記録します。 最初のエラー文の中にある以下の記述を実行してみる ----- mysql client is missing. You may need to 'sudo apt-get install libmariadb-dev', 'sudo apt-get install libmysqlclient-dev' or 'sudo yum install mysql-devel', and try again. ----- 結果的に有効だったのは以下コマンドのみ ターミナル $ sudo yum install mysql-devel 読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd 依存性の解決をしています 〜〜〜〜省略〜〜〜〜 インストール: mariadb-devel.x86_64 1:5.5.68-1.amzn2 依存性関連をインストールしました: mariadb-libs.x86_64 1:5.5.68-1.amzn2 完了しました! bundle installを実行 ターミナル $ bundle ~~~~省略~~~~ Bundle complete! 26 Gemfile dependencies, 109 gems now installed. Use `bundle info [gemname]` to see where a bundled gem is installed. できた
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

高卒26歳未経験がエンジニア内定を貰うまでのストーリー

初めに こんちにはこんばんは。 この度、プログラミング学習と就職活動の末、 合計3社から内定を頂くことが出来ました。 ありがたいことに学習方法などを教えて欲しいとの声が1件だけあったので せっかくなのでQiita記事にします。 使用した市販教材や無料サイトとかも記載します。 これからプログラミングとかアプリの勉強をして転職したいとか思っている方の 参考…になるかはわかりませんが私の学習内容を語っていきます。 ちょっとだけは美化させてくださいね。 学習期間 2021/1~3 就職活動期間 2021/4 私がエンジニアを目指したきっかけ とりあえず、入りはITかっこいいでした笑 スマホの普及だったり業務でもシステム代替えとかを見に染みて感じていました。 前職は大手メーカーの工場の製造現場で設備製造管理、改善、他従業員の残業や勤務シフトの管理等々をやってきました。 私自身、業務の中では特に何かを改善するという事が好きでした。 なんか上手くいった事例では年間○○○万円のコスト削減で社内表彰とかとか。 専門知識の国家資格では県での最優秀賞社表彰もされました。 そんな私が将来を見つめた時に、まぁ何か開発や設計をしていくんだろうなと考えました。 そこで同じ業界での専門性を高めるよりも様々な業界の開発等々をしたいなと思って見つけた業種がエンジニアでした。 学習から内定までの大きな流れ ①目標設定 やりたいことをきめる 「WEBアプリを開発する!」「WEBサイトを作成する」など ②目標に必要な言語や知識を調べる。   ③それぞれについて学ぶ。学びながら必ず何かしらのアウトプットをする。 ④学習した言語での開発を楽にするフレームワーク等々について学ぶ。   ⑤学習した内容を用いて実際にポートフォリオアプリ開発を進める  ⑥完成したポートフォリオアプリを用いて転職活動 ※③、④は技術や言語の回数分反復します! 例 HTML/CSS→Bootstrap JavaScript→jQuery/vue.js Ruby→Ruby on Railsなど 無事、内定入社。 ①~⑤まではオンラインのプログラミングスクールSAMURAI ENGINEERさんで現役のエンジニア講師さんにサポートしていただきました。目標達成にはこういう事をこういう順番で学んだ方が良いなど ※SAMURAIさんは他の授業形式のスクールさんとは違い基本自習ベース+週1で講師さんからのレビュー軌道修正って感じなんで、自走能力をつけたい方にはおすすめです。 ①目標設定 まず、自分が何をやりたいかが重要で私の場合は 「Webアプリケーションを開発して、それをポートフォリオとして入社する」でした。 開発したアプリは両親の○○を解決するものでした。それはアプリの開発段階の話にも紐つきます。 もっと簡略化すると「Webアプリケーションを開発する」ですね。 ここでやんわりとどういうアプリを開発したいかは構想しました。 ②目標に必要な言語や知識を調べる。 Webアプリケーション開発にはざっくりこれらが必要かと 領域 必要言語や技術 フレームワークやライブラリ,使用技術など フロントエンド(ブラウザの見える部分) HTML/CSS/JavaScript Bootstrap/jQuery バックエンド(処理をする部分) Ruby Ruby on Rails インフラ周り(DBやWebサーバー等含む) Heroku使用/PostgreSQL(DB) バージョン管理 Gitコマンド GitHub コンピューター操作 Linuxコマンド MacならTerminal フロントエンド(見える部分)にHTML/CSSのマークアップ言語 それを動かしたり動的にするにはJavaScriptが必要です。 バックエンド(処理する部分)にプログラミング言語のRuby DBやWebサーバー等々を簡単に用意してくれるHerokuというサービスを使用しました。 バージョン管理等々はGitHubを使用。 コードの書き方を楽にしたりしてくれるフレームワークやライブラリが BootstrapやjQuery,Ruby on Railsなどです。 GitHubを使用するにあたりGitコマンドが必要です。 コンピューター操作にはLinuxコマンド等々も必要。 他にも細かい知識は必要ですが、割愛させていただきます。 ③それぞれについて学ぶ。学びながら必ずアウトプットをする。 必要知識についてそれぞれ学んでいきます。 大切なのは都度アプトプットをすることでした。 簡単なものでもいいので、その知識を用いて自分で何か作ることが本当に大切です。 全てのものに対して、教材内容+自分で工夫して展開してみるとかもやりました。 下記にそれぞれの言語技術に使用した教材やサイトを掲載します。 ーHTML/CSS 学習サイト「Progate」 このサイトは本当に有能サイトです。 環境構築が不要でWeb上で学びながら制作できます。 書籍「HTML5/CSS3モダンコーディング フロントエンドエンジニアが教える3つの本格レイアウト スタンダード・グリッド・シングルページレイアウトの作り方」  プロゲートあがりでなにか制作したい場合はこちらがおすすめ。 ブログ風サイトやシングルページレイアウト、グリッドレイアウトのそれぞれの制作ノウハウが詰まってます。実際にテキストエディタやブラウザを用いて制作できます。 学びながら制作するので2周もしたら、結構制作できるようになります。 サンプルコードもダウンロードできるので答え合わせできます。 サイト模写 自分できになったサイトを模写してみたりしました。 プロゲートの内容をローカル環境で模写して答え合わせをするなどもしました。 ここでBootstrapについても学びますが、④学習した言語での・・・に詳しく書きます。 ーJavaScript 学習サイト「Progate」 書籍「確かな力が身につくJavaScript「超」入門 第2版」 こちらもローカル環境で実際に開発する形式ですね。 断片的にこういう動きの場合はこうするっていうところが載っているので そのまま横展開もありです。 こちらもサンプルコードありでした。 ここでjQueryについても学びますが、④学習した言語での・・・に詳しく書きます。 ーRuby 学習サイト「Progate」 最初はプロゲートでやんわり掴んで書籍にステップアップみたいな感じです笑 Rubyを実際に使ってみた 実際にスクレイピングや正規表現を使ってブラウザ上の情報を抜き取ってCSVファイルにする。とかやりました。こちらは書籍とかではなく、自分でググって頑張りました。 ↑上記サイトは参考にしたサイトのひとつです。 書籍「作りながら学ぶRuby入門」 これは結構古い書籍ですが、 Rubyの基礎が詰まってる感じがします。 素のRubyでアプリケーションを開発していくので力がつくと思います。 ここが一番挫折しそうになったところかも。 めっちゃ難しかった。>< Railsをすぐ学べば楽になりますが、基礎のRubyを知らないとダメというアドバイス貰ったのでしっかりやりました。 たしか、サンプルコードそのまま写しても動作しない部分があったのでそこはレッツトライです。笑 たしか文字コード関係のところ。 -Gitについて GitHub 学習サイト「Progate」 サイト内でディレクトリやGitコマンドの関係を学べてとてもいいです。 学習サイト「サル先生のGit入門」 本当は「サルでもわかるGit」みたいなサイト名だったらしいのですが、動物愛護か何かの関係で改名したとか笑 実際に自分でGitHub上にリポジトリ作成したり、なんだりできるので実践形式です。 ーLinuxコマンド 学習サイト「Progate」 学習サイト「侍エンジニアブログ」 コマンドはまぁ覚えるって感じですね。 出来なくてもマウスで操作できることもありますが、後々サーバーアクセスとかした際にコマンドが打てないと 話にならないので覚えました。 ④学習した言語での開発を楽にするフレームワーク等々について学ぶ。 -HTML/CSS → Bootstrap 書籍「Bootstrap4 フロントエンド開発の教科書」 ぶっちゃけCSS知らなくてもBootstrap知っていればレイアウト構築はできる・・・かもしれませんが ブラックボックスになるのは避けたいのでHTML/CSSはしっかり理解した上でフレームワークは使いましょう。 こちらの書籍は実践形式ではなく、それぞれの説明って感じです。 公式のサイトもあります↓ Verや英語表記、日本語表記で内容が違うので注意しましょう。 私は最終的にBootstrap5を使用しました。 4→5の違いもあったのでご注意を!! ーJavaScript → jQuery 学習サイト「Progate」 書籍「jQuery標準デザイン講座」 サンプルコードありで、作りながら学べます。 JSの書籍と似た形式です^^ ーRuby → Ruby on Rails 学習サイト「Progate」 Progate自体がRailsで構築されているの、気合のはいったコースだと思います!笑 内容はたしか、Twitterアプリみたいなの作る感じだったかと。 progateはRails5です。 最新のRailsは6なので変更点等は注意しましょう。 書籍「Railsの教科書」 サイト「小学生でもわかるRuby」 ごめんなさい><こちら調べたらサイトにアクセスできませんでした。 Railsは本当に便利で、コマンド一発で必要なディレクトリやファイル群を生成してくれます。 中には、コードや機能もほぼ網羅して生成してくれるコマンドも存在します。 例:あるデータを作成、読み込み、更新、削除をする。など RubyにはGemといって簡単に使用可能になる機能があります。 フレームワークは便利=ブラックボックスになりやすいのですが、、、 上記の書籍とサイトではそちらの細かい背景や意味を述べているのでおすすめです〜。 サイト「Railsチュートリアル 」 このサイトはまじでおすすめです。これができれば大体開発できると思います。いや本当に。 ただ、最初から触ると挫折するくらい難しいのでprogateや他入門書籍で基礎固めをしてから取り掛かるのが吉ですね。   ⑤学習した内容を用いて実際にポートフォリオアプリ開発を進める  今までの勉強してきた知識を総動員してアプリ開発に取り掛かります。 ここの内容はほぼ割愛させていただきます。 こういうサイトを見て頑張りましょう! とはいえ、載せたサイトや書籍を網羅していれば大体開発イメージはついてると思います。 あとは、自分の作りたいことをプログラムで形にする。 そのために必要な知識を補填しながら進めていく。 一般的な手順は ①要件定義 ②設計 ③開発 ④検査 ですね。 ちなみにこのサイトで モックアップ(サイトレイアウト)やER図(サイトマップ)、データベース設計はしました。 サイトマップやデータベース設計などは「サイトマップ作成 方法」「データベース設計 方法」 で調べれば出てきます^^ 僕はデータベースの正規化など勉強しましたね。 サイトマップとかは感覚で頑張りました。 細かい話なんですけど、LINEと連携して通知やログイン機能をつけたり RedisやSideKiq(なんやねんそれ)を使ってDB内を定時監視したり、、、とか 他の人がやらなさそうなことややってみました。 Railsアプリの開発についての詳細は後日載せたいと思います。 テキトーな説明でごめんさない!! ⑥完成したポートフォリオアプリを用いて転職活動 この辺も割愛します。 面接についてさらっと話すと 今までの経験ゴリ押し 未経験だけど頑張ってアプリ作ったアピール すべての事に対する理由付け なんでRubyを選んだか?なんでそのアプリにした?なんでエンジニアになった? なんで転職したい?なんで?なんで?なんで? 全て自問自答して答えられるようにしました。 面接は頭の中のことを100%出す努力 を意識しました。 企業選定理由とかも後々に!! こちらもテキトーですみません。 最後に 最後になりますが、これらの教材を使って私は学びました。 もちろん、教材外でググって学んだことも沢山あります。 全体的にProgateで基礎とイメージを掴む→書籍などでステップアップ→アウトプットでしたね。 SAMURAIの講師のY.Fさん(本名はまずいと思うので笑)も3ヶ月間自分の悩みや問題に一緒に付き合ってくれました。 youtubeも見たりしました。 堀口セイトさん!プログラミングに対する楽しさを感じることができる動画ばかりです。 ここからは勝手な持論です。 Progate周回はしない方がいいという意見がとても多いですが、私的には個人差あるので周回OKだと思います。 現に私は2周してます。 ただ、Progateは検索等々が用意に行えるので後から基礎的な辞書代わりとしても使えるので その辺は頭にいれて学んでいくのが良いと思います。 2周目はローカル環境でやってみる…とかとか。 沢山の意味わからない呪文みたいなのが出てきて頭パンクしそうになりましたが 何が変数(値が格納されている)?で何がメソッド関数? その変数には何の値がはいってるの?そのメソッド関数の意味は?を分けて見れるようになるとグッと理解できるように なる… いや、なった感触がありましたね。 落ち着いてみると全部繋がっています。プログラミングなので。 私自身はRubyを学びましたが、入社した企業様ではPHP,Java,Pythonを使うことになるので 頑張ってキャッチアップしていきます^^ ここまで見てくださりありがとうございました。 以上
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Ruby on Rails] Seedファイルの作成

データを作成する db/seeds.rb User.create!( email: 'kinpachi@test.com', first_name: '金八', last_name: '坂本', profile_image: File.open('./app/assets/images/kinpachi.jpeg'), password: '123456', history_status: 20, prefecture_code: 20 ) それぞれのカラムに情報を入れる。 特に画像にデータを入れる時は File.open(~~~)で記述する。 複数人のデータを一括作成する。 db 20.times do |n| User.create!( email: "test#{n + 1}@test.com", first_name: "名前#{n + 1}", last_name: "苗字#{n + 1}", profile_image: File.open('./app/assets/images/test.jpg'), password: '123456', history_status: 2, prefecture_code: 2 ) end 20人分のデータを作成している。 emailと名前を別々にしてわかりやすくするために、n + 1として足し算を繰り返す。 1:Nの情報を作成する db/seeds.rb User.all.find_each do |user| user.posts.create!( genre_id: '1', post_image: File.open('./app/assets/images/hoge.png'), title: 'タイトル', content: 'テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト' ) end
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

初学者が「rails new 〜」 で起きたエラー

環境構築をし、ブラウザで「Hello World」を表示させようとしたときに起きた話 スペック macOS Big Sur バージョン11.3.1 MacBook Air (M1, 2020) を2021年5月に購入しました。それまではWindowsをずっと使っていました。 手順 ●rails環境構築 1、Command Line Toolsをインストール 2,Homebrewをインストール(ver 3.1.12) 3,rbenvをインストール(ver 1.1.2) 4,Rubyをインストール(ver 3.0.1) 5,railsをインストール(ver 6.1.3.2) 6,yarnをインストール(ver 1.22.10) ●プロジェクト作成 1、railsでプロジェクト作成 % mkdir ruby_project % cd ruby_project % rails new hello_app 2、hello_appをvscodeで開く 3、「Hello World」実行 起きたエラー % rails new hello_app . . . Argumenterror: method name must be a Symbol but Falseclass is given . . . 訳: Argumenterror:メソッド名はSymbolである必要がありますが、Falseclassが指定されています んー、よくわからない… どこで指定されているのかもわからない… とりあえずインストールしたものを上からバージョンを確認していったところ、 rubyのバージョンが古いものをインストールしている事が判明(最新のをインストールしたつもり…) ruby 3.0.1 をインストールし、railsとyarnも一応再インストールすると 今度はなんの問題もなく、プロジェクト作成に成功 application_controller.rb class ApplicationController < ActionController::Base def hello render html: "Hello World" end end routers.rb Rails.application.routes.draw do # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html root 'application#hello' end と変更し、rails sでサーバーを立ち上げ 見事「Hello World」に成功!!!! その他 hint: Using 'master' as the name for the initial branch. This default branch name hint: is subject to change. To configure the initial branch name to use in all hint: of your new repositories, which will suppress this warning, call: hint: hint: git config --global init.defaultBranch <name> hint: hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and hint: 'development'. The just-created branch can be renamed via this command: hint: hint: git branch -m <name> warning webpack-dev-server > sockjs > uuid@3.4.0: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. warning webpack-dev-server > webpack-log > uuid@3.4.0: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. プロジェクト作成が上手くいったものの、途中でこんなログが表示された。 gitやwebpackのことが書かれているので、こちらも調べて改善していきたい。 感想 M1Macに環境構築するのは初学者では躓いてしまう可能性があると言われている中購入したので 不安はありましたが、今の所なんとかやれているので、大丈夫そうです これからもいろいろな壁にぶつかると思いますが、めげずに頑張りたいと思います。 Qiitaにもアウトプットしていき、同じようなところで躓いている初学者の方のためになったらいいなと思います。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【第4章】Railsチュートリアルで手が止まった箇所まとめ(range、inspect、ファイル作成)

Railsチュートリアル第4章(第6版)で、少し悩んだ点を挙げる。 ①-4.2 文字列とメソッド- にて ● nanoエディタからCtrl-Xで離脱する際、yキーを押して保存したあと、下記画面で何をすればいいのか分からなかった。  →Enterを押せば良いだけだった。 ② -4.3.1 配列と範囲演算子- にて ● 範囲(range)の0..9は省略した説明だと思い、(0123456789).to_aなどと入力してエラーが発生した。  →テキストのまま(0..9).to_aで良かった。 ③-4.3.3 ハッシュとシンボル- にて ● いきなりinspectメソッドが使用されていた為、どういうメソッドか一生懸命調べていた。  →説明が後述されていた。こういうこともあるので、悩んだら後に書かれていないか見てみよう。 ④-4.3.5 ユーザークラス- にて ● ルートディレクトリにexample_user.rbファイルを作成しようとするのだが、コマンド何だったっけ?と思った。  前章に戻って調べてみたが、これまで出てきていないようだ。  この時はCloud9から、対象フォルダにNew Fileで追加した。  →後で調べるとtouch ファイル名で作成できることが分かったが、Railsチュートリアルのこれまでの丁寧な説明を考えると、違和感があった。 まとめ ①②③④で手が止まったが、すぐに解決できた。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Rails] ポートフォリオに実装した機能解説 DM機能編

ポートフォリオに実装した機能を解説していきます! 今回はDM(ダイレクトメッセージ)機能。 目標 機能としては、 ユーザー詳細ページからメッセージルームに飛んで個別にメッセージ、 またやりとりしたメッセージルームは一覧でマイページから取得できる。 ざっくりですがこんな感じ では行こう! 前提 前提としてdeviseの導入を忘れずに! deviseの導入はこちらの記事を参考にしてください。 https://qiita.com/Hal_mai/items/350c400e8763ce0487a3 設計 4つのモデルを使って実装します。 Userモデル => Userの情報(devise) Roomモデル => 自分と相手の2人のユーザーが入ります Entryモデル => どのUserがどのRoomに所属しているかを判断 Messageモデル => UserがどのRoomでどんなMessageを送ったか ER図はこんな感じ User1人1人は他のUserに対して沢山のRoomを持っていることになるのでUserとRoomの関係性は多対多になり中間テーブルとしてEntryテーブルを用意。 またRoom内で2人のUserが沢山のMessageでやりとりするのでこちらも多対多で中間テーブルにMassegeを用意します 実装 では行こう!! モデルの準備 ターミナル $ rails g model room $ rails g model entry user:references room:references $ rails g model message user:references room:references body:text ターミナル $ rails db:migrate リレーション user.rb has_many :entries, dependent: :destroy has_many :messages, dependent: :destroy room.rb has_many :entries, dependent: :destroy has_many :messages, dependent: :destroy entry.rb belongs_to :user belongs_to :room message.rb belongs_to :user belongs_to :room routes routes.rb resources :messages, only: [:create] resources :rooms, only: [:create, :index, :show] Controller & View users_controller.rb users_controller.rb class UsersController < ApplicationController def show @user = User.find(params[:id] @current_entry = Entry.where(user_id: current_user.id) @another_entry = Entry.where(user_id: @user.id) unless @user.id == current_user.id @current_entry.each do |current| @another_entry.each do |another| if current.room_id == another.room_id @is_room = true @room_id = current.room_id end end end unless @is_room @room = Room.new @entry = Entry.new end end end 解説 @current_entry = Entry.where(user_id: current_user.id) @another_entry = Entry.where(user_id: @user.id) ログインしてるユーザーとメッセージ相手のユーザー情報をEntryテーブルから検索して取得します。 unless @user.id == current_user.id @current_entry.each do |current| @another_entry.each do |another| if current.room_id == another.room_id @is_room = true @room_id = current.room_id end end end unless @is_room @room = Room.new @entry = Entry.new end end end unlessでログインしていないユーザーという条件をつけます。 そしてさっき取得した2つのユーザー情報をそれぞれeachで取り出してEntryテーブル内に同じroom_idが存在するかどうかを調べます。 同じroom_idが存在する場合は既にroomが存在しているということなのでroom_idの変数とroomが存在するかどうかの条件であるis_roomを渡します。 同じroom_idが存在しない場合は新しくインスタンスを作成します。 users/show.html.haml 続いてviewです。 viewはhamlで書いてます。 show.html.haml - unless @user.id == current_user.id - if @is_room == true = link_to 'メッセージへ', room_path(@room_id) - else = form_for @room do |f| = fields_for @entry do |e| - e.hidden_field :user_id, value: @user.id = f.button type: :submit do メッセージを送る  ここではログインしているユーザーではないという条件をつけてis_roomの条件を使って既に部屋が存在しているかどうかで分岐させます。 既に部屋が存在していればその部屋に、していなければformでコントローラーにパラメーターを送っています。 rooms_controller.rb rooms_controller.rb class RoomsController < ApplicationController before_action :authenticate_user! def create room = Room.create current_entry = Entry.create(user_id: current_user.id, room_id: room.id) another_entry = Entry.create(user_id: params[:entry][:user_id], room_id: room.id) redirect_to room_path(room) end def index # ログインユーザー所属ルームID取得 current_entries = current_user.entries my_room_id = [] current_entries.each do |entry| my_room_id << entry.room.id end # 自分のroom_idでuser_idが自分じゃないのを取得 @another_entries = Entry.where(room_id: my_room_id).where.not(user_id: current_user.id) end def show @room = Room.find(params[:id]) @messages = @room.messages.all @message = Message.new @entries = @room.entries @another_entry = @entries.where.not(user_id: current_user.id).first end end 解説 def create room = Room.create current_entry = Entry.create(user_id: current_user.id, room_id: room.id) another_entry = Entry.create(user_id: params[:entry][:user_id], room_id: room.id) redirect_to room_path(room) end ここでusers/show.html.hamlで部屋が存在しなかった場合にformで送られてきたパラメーターきます。 やっていることとしては現在ログインしているユーザーとメッセージ相手のユーザーそれぞれの情報をroom_idで紐付けてEntryテーブルにcreateしています。 def index current_entries = current_user.entries my_room_id = [] current_entries.each do |entry| my_room_id << entry.room.id end @another_entries = Entry.where(room_id: my_room_id).where.not(user_id: current_user.id) end 続いてindex indexでは現在やりとりしているroom一覧を取得します。 current_entries = current_user.entries my_room_id = [] current_entries.each do |entry| my_room_id << entry.room.id end まずここでログインユーザーがやりとりしているroomのIDをすべて取得しそれを配列化してmy_room_idとします。 @another_entries = Entry.where(room_id: my_room_id).where.not(user_id: current_user.id) そしてEntryテーブルからmy_room_idでuser_idが自分のIDじゃないレコードを取り出します。 こうすることで現在自分が参加中のroomを相手の情報で取得しviewで表示することができます。 rooms/index.html.haml index.html.haml - @another_entries.each do |entry| = link_to room_path(entry.room) do .card .card-body %div .d-flex .chat-avatar %object = link_to user_path(entry.user) do = image_tag entry.user.avatar_image .chat-user-name = entry.user.display_name chat-text = Message.find_by(id: entry.room.message_ids.last)&.body = Message.find_by(id: entry.room.message_ids.last)&.body ここではroomの最後のメッセージを表示しています。 def show @room = Room.find(params[:id]) @messages = @room.messages.all @message = Message.new @entries = @room.entries @another_entry = @entries.where.not(user_id: current_user.id).first end end ここでは@roomで1つのroomを表示 @messagesで過去のやりとりを全て表示し@messageで新しいメッセージを作るためのインスタンスを作成。 @@entriesと@another_entryでview側に相手の名前を表示させています。 rooms/show.html.haml show.html.haml .title %h2 = ("#{@another_entry.user.email}さんとのメッセージ") - @messages.each do |m| - if m.user_id == current_user.id .mycomment %p = m.body - else .fukidasi .faceicon = image_tag m.user.email .chatting .says %p = m.body .chat-form-box = form_for @message do |f| .chat-form-group = f.text_field :body = f.hidden_field :room_id, :value => @room.id = f.submit "送信する" @anoter_entryで相手の名前やメールアドレスで表示させることができます。 @messagesをそれぞれIDで分岐させることでLineっぽく自分のメッセージは右、相手のメッセージは左みたいなスタイルを作ることができます。 form部分では@messageの他にこのmessageがどのroomに所属しているかを判断するためにhidden_fieldにroomの情報を持たせてます。 そしてこのformで送られたパラメーターがmessages_controllerに渡ります。 messages_controller.rb messages_controller.rb class MessagesController < ApplicationController before_action :authenticate_user! def create message = Message.new(message_params) message.user_id = current_user.id if message.save redirect_to room_path(message.room) else redirect_back(fallback_location: root_path) end end private def message_params params.require(:message).permit(:room_id, :body) end end 最後にmessage部分。 rooms/show.html.hamlから送られたパラメータをcreateします。 やっていることは、自分のmessageかどうかで分岐させてtrueならroom_idとbodyをパラメーターで許可してcreateしています。 この辺はいつものcreate actionと同じですね。 完成 中間テーブルが2つあって複雑ですが1つ1つ取り出してみるとやっていることは初心者の僕でも理解できるような内容でした。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

シングルページウェブアプリの運用[Rails+heroku]

Overview よくあるRailsをherokuにpushして運用するまで HTMLページをRails化するためのシンプルなフロー シングルページにお知らせ機能だけ追加 Rails 6.1.3.2 ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-darwin20] Create Static Pages 既存リポにappを追加するとき // desktopとかに既存リポと同名のappを作成 $ rails new $ git init $ git add . $ git commit -m'...' //新規作成したいブランチを作成 $ git checkout -b [branchName] //リモートリポを登録 $ git remote add origin [URL] // 新規ブランチとして既存リポにアプリを登録 $ git push --set-upstreadm [branchname] もっといいやり方ありそうなものだけども・・・ アプリの作成 // バージョンを指定してアプリを作成 $ rails _6.1.3.2_ new app $ cd app 作業用ブランチの作成とmerge 作業用のブランチを作って逐一mergeとpushすることでミスっても大丈夫なように(保険) // 作業用のブランチ作成+移動 $ git checkout -b f/[追加する機能名] [何かしらの作業をする] $ git add . $ git commit -m'[Type massage]' // mergeされる元ブランチに移動 $ git checkout [元のブランチ名] // 作業ブランチをmerge $ git merge f/[追加する機能名] // ローカルでの動作チェック $ rails s http://localhost:3000 にアクセス // 動作確認ができたらpushする $ git push && git push heroku herokuにdeproyする準備 https://rubygems.org/で必要なgemを探します gemfile /*herokuではsqlite3は使えない、けどmacはデフォルトでsqlightなのでdevelopment環境に移動*/ /*gem 'sqlite3', '~> 1.4'*/ . . . group :development, :test do gem 'sqlite3', '~> 1.4' end gemfile /*本番環境ではherokuのDBであるpostgresを設定してあげる*/ group :production do gem 'pg', '~> 1.2', '>= 1.2.3' end // --without productionをつけることでpostgresをダウンロードせずにbundle installできる $ bundle install --without production $ git add . $ git commit -m'Type massage!' $ git push mainブランチ以外をherokuにpushする 今回はspw_appというブランチをpushしようとして反映されませんでした そんな時は // これでブランチ名を指定してあげるとpushできまーす $ git push heroku spw_app:master --force // アプリをブラウザで開く $ heroku open リソースの取り扱い image, fontなどのリソースの置き場所は2つあるらしい。 本来はassetsいかにおくのが望ましいらしいけど、なんだか面倒くさそうだったし今回は1ページのみで動的機能もないペライチなのでpublic以下に入れました。 SCSSの導入 Railsはgemでscssが最初から使えるので、あとは以下の設定をするだけ gemfile /*デフォでは拡張子がcssになってますのでこれを変更しましょうsをつけるだけです*/ assets/application.css . . . assets/application.scss アプリをteamへ移行する ここではアプリの組織的な運用を考えます。 teamは5人以下であれば無料で使えるらしいので、そのくらいの規模の組織でいくつかのアプリを運用するならこれ personalでは5つまで無料で作成できます しかし、30分でスリープするなど実用的ではないのでhobbyプラン($7/month)に移行する必要があります また、personalだと組織的な運用も面倒くさいのでteamを作ってそこにアプリをtransferしましょう(teamにアプリをtransferすると自動でhobbyプランに切り替わってくれます) こうすることでpersonalな空間には常にテスト段階のアプリを5つまで無料で稼働させ、本格的なアプリの運用はteamの中でhobbyプランで行うことができます Add news 多くのWebサイトやアプリに実装されている「お知らせ」機能を実装します。 scaffoldで一気に機能を作る 実際に動くかCRUD処理を確認する staticPageにnews_indexを表示する Add Authenticase お知らせは管理者(admin)のみが実行できる機能なので、最低限の認証機能(アカウント登録・ログイン機能)を実装します。 このままじゃ誰でもお知らせを投稿できちゃうので。 deviceの追加 初期設定(amdinも設定) お知らせ機能に認証を追加 consoleからアカウントテスト(追加・削除) seeds機能を使ってアカウントの作成 認証機能のテスト
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rails+heroku

Overview よくあるRailsをherokuにpushして運用するまで 久々にrailsを触ったら忘れてしまっていたので、メモメモ Rails 6.1.3.2 ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-darwin20] Create Static Pages 既存リポにappを追加するとき // desktopとかに既存リポと同名のappを作成 $ rails new $ git init $ git add . $ git commit -m'...' //新規作成したいブランチを作成 $ git checkout -b [branchName] //リモートリポを登録 $ git remote add origin [URL] // 新規ブランチとして既存リポにアプリを登録 $ git push --set-upstreadm [branchname] もっといいやり方ありそうなものだけども・・・ アプリの作成 // バージョンを指定してアプリを作成 $ rails _6.1.3.2_ new app $ cd app 作業用ブランチの作成とmerge 作業用のブランチを作って逐一mergeとpushすることでミスっても大丈夫なように(保険) // 作業用のブランチ作成+移動 $ git checkout -b f/[追加する機能名] [何かしらの作業をする] $ git add . $ git commit -m'[Type massage]' // mergeされる元ブランチに移動 $ git checkout [元のブランチ名] // 作業ブランチをmerge $ git merge f/[追加する機能名] // ローカルでの動作チェック $ rails s http://localhost:3000 にアクセス // 動作確認ができたらpushする $ git push && git push heroku herokuにdeproyする準備 https://rubygems.org/で必要なgemを探します // herokuではsqlite3は使えない、けどmacはデフォルトでsqlightなのでdevelopment環境に移動 // gem 'sqlite3', '~> 1.4' . . . group :development, :test do gem 'sqlite3', '~> 1.4' end // 本番環境ではherokuのDBであるpostgresを設定してあげる group :production do gem 'pg', '~> 1.2', '>= 1.2.3' end // --without productionをつけることでpostgresをダウンロードせずにbundle installできる $ bundle install --without production $ git add . $ git commit -m'Type massage!' $ git push mainブランチ以外をherokuにpushする 今回はspw_appというブランチをpushしようとして反映されませんでした そんな時は // これでブランチ名を指定してあげるとpushできまーす $ git push heroku spw_app:master --force // アプリをブラウザで開く $ heroku open リソースの取り扱い image, fontなどのリソースの置き場所は2つあるらしい。 本来はassetsいかにおくのが望ましいらしいけど、なんだか面倒くさそうだったし今回は1ページのみで動的機能もないペライチなのでpublic以下に入れました。 SCSSの導入 Railsはgemでscssが最初から使えるので、あとは以下の設定をするだけ // デフォでは拡張子がcssになってますのでこれを変更しましょうsをつけるだけです assets/application.css . . . assets/application.scss アプリをteamへ移行する ここではアプリの組織的な運用を考えます。 teamは5人以下であれば無料で使えるらしいので、そのくらいの規模の組織でいくつかのアプリを運用するならこれ personalでは5つまで無料で作成できます しかし、30分でスリープするなど実用的ではないのでhobbyプラン($7/month)に移行する必要があります また、personalだと組織的な運用も面倒くさいのでteamを作ってそこにアプリをtransferしましょう(teamにアプリをtransferすると自動でhobbyプランに切り替わってくれます) こうすることでpersonalな空間には常にテスト段階のアプリを5つまで無料で稼働させ、本格的なアプリの運用はteamの中でhobbyプランで行うことができます Add news 多くのWebサイトやアプリに実装されている「お知らせ」機能を実装します。 また、管理者のみに許される機能なので、最低限の認証機能も紹介します。 お知らせ機能を作る scaffoldで一気に機能を作る 実際に動くかCRUD処理を確認する staticPageにnews_indexを表示する 認証機能を追加する deviceの追加 初期設定(amdinも設定) お知らせ機能に認証を追加 consoleからアカウントテスト(追加・削除) seeds機能を使ってアカウントの作成 認証機能のテスト
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Railsをガイドに沿って基礎から学ぶ③

はじめに この記事はスキルアップを目的とした記録です。 分からない部分を自分なりに補足して書いてます。 前回はデータベースとのやり取りを実現しました。 今回はCRUD操作について学習していきます。 CRUD操作 CRUD操作とは、データベースに対する作成、読込、更新、削除の事を指します。アプリケーションを作成する上で非常に非常に重要な部分になります。 1.記事を表示する 前回の学習では、すべての記事を表示するように作成しました。 ここでは全ての記事1件毎に対応した画面(タイトルと本文を表示させる)を作成します。 新しい画面を用意するために、controller、routesを編集してviewを追加します。 C:\blog\app\controllers\articles_controller.rb class ArticlesController < ApplicationController def index <省略> end def show @article = Article.find(params[:id]) end end アクションメソッド(show)を追加しました。 これでshowが呼び出されたときにArticlesテーブルから一意であるidカラムを元にデータを取得し、article変数に格納しています。 Controllerにアクションの追加をしたら次はルーティングの設定です。 C:\blog\config\routes.rb Rails.application.routes.draw do root "articles#index" get "/articles" , to: "articles#index" get "/articles/:id" , to: "articles#show" end ここで注意すべきはパスの末尾に[:id]が追加されているところです。 これはルーティングのパラメーターを指定します。 ルーティングのパラメーターはリクエストのパスに含まれる特定の値を取得して、その値をparamsというハッシュに保存する。 次にViewです。 C:\blog\app\views\articles\show.html.erb <h1><%= @article.title %></h1> <p><%= @article.body %></p> ここではcontrollerで作成したarticle変数を使用して、記事に対するタイトルと本文を表示するようになっています。 これで、 http://localhost:3000/articles/1 を開くと記事を閲覧することが出来ます。 このように上にタイトル、下に本文が表示されていれば成功です。 2.リソースフルルーティング ここまでにCRUD操作のREADを行いました。 ここではRailsのresourcesメソッドを使用してルーティングを書き直します。 C:\blog\config\routes.rb Rails.application.routes.draw do root "articles#index" resources :articles end 先ほどはアクション名毎にルーティングの設定をしていましたが、このresourcesメソッドを使用すると簡単にアクショ名とURLを紐づけることが出来ます。 ルーティングを表示するには以下のコマンドを実行します。 $rails routes ↓結果 Prefix Verb URI Pattern Controller#Action root GET / articles#index articles GET /articles(.:format) articles#index new_article GET /articles/new(.:format) articles#new article GET /articles/:id(.:format) articles#show POST /articles(.:format) articles#create edit_article GET /articles/:id/edit(.:format) articles#edit PATCH /articles/:id(.:format) articles#update DELETE /articles/:id(.:format) articles#destro <以下省略> 様々なURIパターンとアクションが紐づいていることがわかります。 簡潔に書ける上にルールに従って生成されるため、ルールを覚えれば非常にわかりやすいですね。 更にresourceメソッドで宣言したルーティングにはパスヘルパーメソッドというものも設定します。 パスヘルパーとはPrefixに記している文字列に「_path」などを追加した形で利用ができ、それに紐づいたURLを返します。 このパスヘルパーを用いてindexからshow:idに飛べるようにリンクを張ります。 C:\blog\app\views\articles\index.html.erb <h1>Articles</h1> <ul> <% @articles.each do |article| %> <li> <%= link_to article.title, article %> </li> <% end %> </ul> <%= link_to ariticle.title, article %>の部分で第1引数に表示する文字列、第2引数にリンク先を指定できます。 1.3記事を作成する 次はCRUDのCです。 Railsアプリケーションでは新しくデータを作る際にはnewアクションとcreateアクションを組み合わせて扱うため、2つのアクションをコントローラーに追加します。 C:\blog\app\controllers\articles_controller.rb class ArticlesController < ApplicationController <省略> def new @article = Article.new end def create @article = Article.new(title: "...", body: "...") if @article.save redirect_to @article else render :new end end end それぞれのメソッドについて、newアクションは新しい記事を1件インスタンス化しますがデータベースには保存しません。 createアクションは新しい記事を1件データベースに保存をします。 1.4フォームビルダーを使う ここではフォームビルダーという機能を使います。 フォームビルダーを使えば最小限のコードで設定がすべてできたフォームを表示することが出来る上に、Railsの規約に沿ったものが出来上がります。 先ほどコントローラーにアクションを追加したnewについて書いていきます。 C:\blog\app\views\articles\new.html.erb <h1>New Article</h1> <%= form_with model: @article do |form| %> <div> <%= form.label :title %><br> <%= form.text_field :title %> </div> <div> <%= form.label :body %><br> <%= form.text_area :body %> </div> <div> <%= form.submit %> </div> <% end %> form_withを利用してarticlesテーブルに対するフォームを生成しました。 http://localhost:3000/articles/new にアクセスすると このように入力フォームが出来上がります。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Rails]Rinkuを使って、URLを自動的にリンクにする

はじめに 本記事はURLを自動的にaタグに変換できるRinkuについて解説したものです。 これを使えば記事系や投稿系のアプリケーションの投稿データなどのURLをリンクにすることが可能です。 記事の最後には改行を出力するsimple_formatと組み合わせた記述の仕方も解説しています。 ドキュメント(github) → https://github.com/vmg/rinku インストール 以下を入力してbundle installします Gemfile gem 'rinku' 使い方 Rinkuは以下のような形式で書きます <%= raw Rinku.auto_link(h(変数)) %> <%= raw Rinku.auto_link(h("http://www.foo.com"))%> 上記のようにすると以下のように出力されます。 <a href="http://www.foo.com">http://www.foo.com</a> またこのURLを外部リンクにしたい場合は以下のようにします。 <%= Rinku.auto_link("http://www.foo.com" ,:all, 'target="_blank"')%> 'target="_blank"'のように文字列として指定することで外部リンクとして実装できます。 (応用) simple_formatと組み合わせる simple_formatと組み合わせることで引数に指定したオブジェクトの改行を出力することができます。 <%= row Rinku.auto_link(simple_format(h(変数)) ,:all, 'target="_blank"')%>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Railsで悲観的ロック、楽観的ロック

まず各排他制御の方式について簡単に整理。 悲観的ロックとは 更新対象のデータを取得する際にロックをかけることで、他のトランザクションからは更新されないようにする方式。 更新が終ってから他の更新を開始することで整合性を担保する。 ・更新のロックはRDBMSの"SELECT 〜 FOR UPDATE"を利用して実現される。 楽観的ロックとは 更新対象のデータがデータ取得時と同じ状態であることを確認してから更新する方式。 同じ状態でなければ、エラーを発生させデータの整合性を担保する。 ・データがデータ取得時と同じ状態であることの確認は、テーブルにバージョン管理のためのカラムを追加することで実現する。 排他制御に関しては、以下の記事が超分かりやすかったです。 https://qiita.com/NagaokaKenichi/items/73040df85b7bd4e9ecfc Railsでの実現方法 楽観的ロック ・lock_versionというカラムを追加するだけでok。(defaultは0にする必要がある) このカラムを追加すると、更新対象のデータがデータ取得時と同じ状態かどうかを lock_versionの値によって判断し、同じ状態でなかった時にrailsが例外を発生させてくれる。 悲観的ロック ・データ取得時にlockメソッドをつける。 こうすることで、SELECT 〜 FOR UPDATEが発行され他のトランズアクションからのupdate をロックしてくれる。 ex) books.nameを更新する処理の場合。 Book.transaction do book = Book.lock.find(n) book.update!(name: '化学の新研究') end
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

初学者がM1 Mac でRuby,Railsの環境構築をした時に起きたエラー

Qiita初投稿を環境構築でつまずいた話にさせていただきます。 スペック macOS Big Sur バージョン11.3.1 MacBook Air (M1, 2020) を2021年5月に購入しました。それまではWindowsをずっと使っていました。 環境構築の手順 まずRubyとRailsの環境構築をするために、次の動画を参考にしました。 https://youtu.be/z3pjRoHuhEc なぜこの動画かというと、「m1 mac ruby rails 環境構築」で一番上に出てきたからです。 01:08 M1Macの環境はIntelMac環境と大きく違うことに注意しよう 04:10 Rosetta上なのかARMアーキテクチャ上なのか意識しよう 07:22 実践編スタート 07:37 ①前提 09:37 Rubyの文法だけ試したい人におすすめな環境 11:53 いまRosseta上かARMアーキテクチャ上か確認コマンド 13:39 ②rbenvでRubyをインストールスタート 13:54 CommandLineToolsをインストール 15:30 Homebrewとは?パッケージマネージャーとは? 17:13 Homebrewをインストールしよう 18:11 brewコマンドが使えるか確認しよう 19:30 Homebrewのバージョンに気をつけよう 21:15 rbenvをインストール 24:03 パスを通して初期化しよう(.zshrc編集) 29:37 rbenvコマンド使えるか確認しよう 31:51 Rubyをインストール 38:45 ③RailsでHelloWorldまでスタート 39:02 railsをインストール 42:07 yarnをインストール 44:24 railsでプロジェクト作成 49:17 HelloWorld実行 エラー 動画と全く同じように構築していき、しっかりそれぞれコマンドも使えるか確認しながら進め、 rails new hello_app でプロジェクト作成をし、 それでvscodeのターミナルを開いてみると… 「/Users/xxxxxxx/.zshrc:23: command not found: rbenv 」 が表示されてしまう。 調べてみても、海外の記事ばかりで、解決策をすべて試してみても全く変わらず… よくパス(PATH)という言葉が出てきたので、「PATHとは」で検索してみたり… そこで動画をじっくり見てると、homebrewのパスが通っていない可能性を見つけ 「export PATH="/opt/homebrew/bin:$PATH"」   を.zshrcに追加(投稿者の方はここの説明はしていなかった)が状況は変わらず… もう一度エラー文をみてみると「.zshrc:23」が目に入り、ここで.zshrcファイルの23行目が おかしいからエラーが起きているということに気がつく。 そこに書いてあったのが「eval "$(rbenv init -)"」 動画で追加をしようといわれ、わけもわからず追加した次の文 export PATH="$HOME/rbenv/bin:$PATH" eval "$(rbenv init -)" 何度もみて、同じことをしているから間違ってはいないはず。 Qiitaで質問 ここで遂にQiitaを使って質問することにした。その記事のURLを下に掲載。 https://qiita.com/falconao/questions/3102843ca983c1ef3265#answer-c8feb9b6f7a39219592f そこで一度rbenvをアンインストールし、大元の記事を見ながら再インストールすることを勧められた。 もう一度やり直してみると、 「/Users/xxxxxxx/.zshrc:23: command not found: rbenv 」 「/Users/xxxxxxx/.zshrc:24: command not found: rbenv 」 とエラーが起きた。 そこでもう一度じっくり.zshrcファイルを見ると export PATH="$HOME/rbenv/bin:$PATH" eval "$(rbenv init -)" eval "$(rbenv init -)" export RBENV_ROOT=$(brew --prefix rbenv) export PATH=$RBENV_ROOT/bin:$PATH eval "$(rbenv init -)" と2箇所で似ているような記述があった。 前者は動画を見て追加し、後者はおそらく何かの記事をみて独自で付け足したものである。 ここで23、24行目がおかしいと言われていることはわかったため、その2行を消去した。 そしたら「command not found: rbenv」は表示されなくなり、解決した。 感想 なんとかRuby,Railsの環境構築することができました。 PATHの理解がまだ不十分であるので勉強しなければならないなと思いました。 Qiitaの記事や質問の投稿の仕方もより良いものにできるよう頑張ります。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】device使用してURLにアクセス時に、422 Unprocessable Entityと気の対処法

症状 Advanced REST clientを使用して、URLにPOSTでAPIを叩くと、以下のエラーが発生してしましました。 error 422 Unprocessable Entity 422 Unprocessable Entityは、サーバーが要求本文のコンテンツ型を理解でき、要求本文の構文が正しいものの、中に含まれている指示が処理できなかったことを表します(引用) つまり、postしたbodyの記述が間違っているようです post { email:"nekonekonekko", password:"123456" } 解決方法 jspmの左側の文字を""で囲むことで解決しました。 post { "email":"nekonekonekko", "password":"123456" } 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む