- 投稿日:2021-01-20T23:40:52+09:00
railsで検索機能を実装する方法(複数カラムも対応)
開発環境
Mac OS Catalina 10.15.7
ruby 2.6系
rails 6.0系前提
前提として、現在私が作っている、記事を投稿できるアプリを例に説明します。
私はモデル名はpostモデルとしています。(参考にする際は、自分用に置き換えてください。)ルーティング設定
まずはルーティングを設定します。
今回はsearchアクションという、基本アクション(index,new,create,show,edit,update,destroy)以外のアクションを定義する必要があるため、collectionを使い設定します。routes.rbRails.application.routes.draw do devise_for :users root to: "posts#index" resources :posts do resources :comments, only: [:create, :destroy] collection do get 'search' end end resources :users, only: :show endcollectionを使うと、ルーティングのURLと実行されるコントローラーを任意にカスタムできます。
また、ルーティングにidを含めたいときはmemberが使えます。routes.rbmember do get 'search' end単純にcollectionのところをmemberにするだけです。
今回の私の例ではidは必要ないので、collectionを使っています。
検索フォーム作成
ルーティングができたので、ビューに配置する検索フォームを作っていきます。
index.html.erb<%= form_with(url: search_posts_path, local: true, method: :get, class: "search-form") do |form| %> <%= form.text_field :keyword, placeholder: "投稿を検索する", class: "search-input" %> <%= form.submit "検索", class: "search-btn" %> <% end %>いろいろ書き方があるとは思いますが、自分はこんな感じで習いました。
ポイントは先ほどのルーティング設定で生成したパス(search_posts_path)が入っていること(パスの名前はコンソールで確認しましょう)、それとmethod: :getを忘れないことぐらいですかね。
加えてform_withのtext_fieldのキー名はkeywordとしました。
モデルに検索の処理を記述
それでは実際に検索する際の処理をモデルに書いていきます。
このとき、コントローラーに書いてしまいたくなる気持ちはわかりますが、テーブルとやり取りをするようなメソッドを定義する際は極力モデルに書くようにしましょう。
def self.search以下(最下部のendは除く)が今回記述した内容です。post.rbclass Post < ApplicationRecord extend ActiveHash::Associations::ActiveRecordExtensions belongs_to_active_hash :category belongs_to :user has_one_attached :image has_many :comments, dependent: :destroy with_options presence: true do validates :image validates :title validates :category_id, numericality: { other_than: 1 , message: "は--以外から選んでください"} end def self.search(search) if search != "" Post.where(['title LIKE(?) OR explanation LIKE(?) OR animal_name LIKE(?)', "%#{search}%", "%#{search}%", "%#{search}%"]) else Post.includes(:user).order('created_at DESC') end end end基本的な書き方としては
オブジェクト名.where('検索をかけたいカラム名 LIKE(?)', "%#{search}%")複数のカラムで検索をかけたいときは
オブジェクト名.where(['検索をかけたいカラム名 LIKE(?) OR 検索をかけたいカラム名 LIKE(?)', "%#{search}%", "%#{search}%"])みたいな感じで実行できます。
自分の場合は3つのカラムで検索をかけたいので上記のような記述になります。また、if文で検索欄が空だった場合には、postの一覧が表示するように記述しました。
コントローラー記述
次にコントローラーを記述します。
posts_controller.rbdef search @posts = Post.search(params[:keyword]) end先ほどモデルに定義したsearchメソッドを使っています。
引数のparamsの中の[:keyword]は、検索フォームを作った際に設定したもので、text_fieldのキー名です。ビュー作成
最後にsearchアクションが参照するビューを作成します。
別に作らなくても、renderでindexページに飛ばしたりもできると思います。search.html.erb<%= render "shared/header"%> <%= form_with(url: search_posts_path, local: true, method: :get, class: "search-form") do |form| %> <%= form.text_field :keyword, placeholder: "投稿を検索する", class: "search-input" %> <%= form.submit "検索", class: "search-btn" %> <% end %> <% if @posts == [] %> <h2 class = "seach-result">検索結果はありません</h2> <% else %> <div class = "post-contents"> <ul class = "post-list"> <% @posts.each do |post| %> <li class = "list"> <%= link_to post_path(post.id) do %> <%= image_tag post.image, class: "post-img" %> <h3 class='post-title'><%= post.title %></h3> <p class = "root-show">〜クリックして詳細を見る〜</p> <% end %> </li> <% end %> </ul> </div> <% end %> <%= link_to new_post_path, class: 'post-btn' do %> <span class='post-btn-text'>投稿する</span> <% end %> <%= render "shared/footer" %>以上がrailsにおける検索機能の実装方法です。
参考になれば幸いです。
- 投稿日:2021-01-20T23:29:52+09:00
rails test がデータベースの参照エラーで失敗する
経緯
Docker の中で Rails と MySQL を立て、 rails test でテストを実行しようとしたところ、エラーとなりました。
docker-compose.ymlservices: mysql_test: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: aaa MYSQL_USER: user MYSQL_PASSWORD: password TZ: 'Asia/Tokyo' command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci$ rails test test/integration/aaa_test.rb Error: AaaTest#aaa: ActiveRecord::ConnectionNotEstablished: Access denied for user 'user'@'%' to database 'aaa-1'エラー内容を見ると
aaa-1
を参照しており、そのデータベースはないのでエラーとなっています。解決策
test_helper.rb にある
parallelize(workers: :number_of_processors)
の影響なので、 PARALLEL_WORKERS を変更して suffix がつかないようにします。$ PARALLEL_WORKERS=1 rails test test/integration/aaa_test.rbこれで動作します。
- 投稿日:2021-01-20T23:01:55+09:00
Ruby Gem Code Reading settingslogic 編その1
背景
この記事を読んで、コードリーディングしながらRubyの知識深めようと思ったため
https://blog.freedom-man.com/try-rubygem-codereading対象
コードを読む準備をする
対象のgem をインストールする
$ bundle initさっそく最初からつまずく..
$ gem install settingslogic ERROR: Loading command: install (LoadError) dlopen(/Users/XXXX/.rbenv/versions/2.4.2/lib/ruby/2.4.0/x86_64-darwin16/openssl.bundle, 9): Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib Referenced from: /Users/XXXX/.rbenv/versions/2.4.2/lib/ruby/2.4.0/x86_64-darwin16/openssl.bundle Reason: image not found - /Users/XXXX/.rbenv/versions/2.4.2/lib/ruby/2.4.0/x86_64-darwin16/openssl.bundle ERROR: While executing gem ... (NoMethodError) undefined method `invoke_with_build_args' for nil:NilClassopensslのリンクがおかしくなっているのが原因らしく、こちらの記事を参考に修正
https://qiita.com/Capotasto/items/16be7620c4eed42efccb
https://qiita.com/YoshiyukiKato/items/e4f67c588d2943c1253d$ brew uninstall --force --ignore-dependencies openssl $ brew install openssl $ brew link openssl $ rbenv uninstall 2.4.2 $ rbenv install 2.4.2これで行けた。
$ echo 'source "https://rubygems.org"' >> ./Gemfile $ echo 'gem "settingslogic"' >> ./Gemfile $ echo 'gem "pry"' >> ./Gemfile $ bundle config set --local path 'vendor/bundle' $ bundle install対象のファイルを確認
fileは1ファイルだけ
settingslogic.rbコードの中身をざっと見てみる
class Settingslogic < HashHashクラスを継承しているらしい
keyとvalueをかんたんに突っ込みやすくしてるのかな?
def [](key) instance.fetch(key.to_s, nil) end def []=(key, val) # Setting[:key][:key2] = 'value' for dynamic settings val = new(val, source) if val.is_a? Hash instance.store(key.to_s, val) instance.create_accessor_for(key, val) endこの辺はHashクラスのオーバーライドっぽい
new(val, source)
newってこんな書き方できるんだ。ここではクラス内のinitializeが呼ばれ(初期化),指定されたkeyで現状のインスタンスに追加されていますね。
というか演算子の挙動をメソッドとしてオーバーライドできるんですね。
def initialize(hash_or_file = self.class.source, section = nil) #puts "new! #{hash_or_file}" case hash_or_file when nil raise Errno::ENOENT, "No file specified as Settingslogic source" when Hash self.replace hash_or_file else file_contents = open(hash_or_file).read hash = file_contents.empty? ? {} : YAML.load(ERB.new(file_contents).result).to_hash if self.class.namespace hash = hash[self.class.namespace] or return missing_key("Missing setting '#{self.class.namespace}' in #{hash_or_file}") end self.replace hash end @section = section || self.class.source # so end of error says "in application.yml" create_accessors! endここでyamlを読み込むみたい。この中の
if self.class.namespace hash = hash[self.class.namespace] or return missing_key("Missing setting '#{self.class.namespace}' in #{hash_or_file}") endここは指定したnamespaceのデータだけhashとして使うってことかな
使ってみる
settings.yamldefaults: &defaults cool: saweet: nested settings neat_setting: 24 awesome_setting: <%= "Did you know 5 + 5 = #{5 + 5}?" %> development: <<: *defaults neat_setting: 800 test: <<: *defaults production: <<: *defaultssetting.rbrequire 'settingslogic' class Settings < Settingslogic source File.expand_path("../settings.yml", __FILE__) namespace ENV['ENV'] endsample.rbrequire File.expand_path("../settings.rb", __FILE__) puts Settings.neat_setting puts Settings.awesome_setting puts Settings.cool.saweet\w $ ENV=production ruby sample.rb 24 Did you know 5 + 5 = 10? nested settingsひとまずざっくりは追いかけられた。
railsに入れてから試すのもいいが、ラクしたかったのでちょくで出力した。公式見るとdynamic bindingなどがあるのだが、
直で実行するとエラーになってしまう。。次はRailsに入れつつもう少しコード追いかけよう。
200行もないので割ととっつきやすい。
- 投稿日:2021-01-20T22:30:38+09:00
【Bootstrap】いきなりログアウトできなくなった〜なんでや?CSRF問題らしい〜
解決したいこと
Bootstrapを導入してからログアウトができなくなってしまった。
発生している問題・エラー
ログイン後、ヘッダー部分にあるログアウトボタンを押すとエラーメッセージが出て、一生ログアウトできない。
該当するソースコード
application.html.erb<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <meta name="description" content=""> <meta name="author" content="Mark Otto, Jacob Thornton, and Bootstrap contributors"> <meta name="generator" content="Jekyll v4.0.1"> <title>Party Freak</title> <%= stylesheet_link_tag 'application', media: 'all'%> 〜以下略〜以前のソースコード
application.html.erb<!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <title>Party Freak</title> <%= csrf_meta_tags %> <%= csp_meta_tag %> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous"> <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %> 〜以下略〜自分で試したこと
<html>
の<head>
部分の記述を導入前に戻すと、ログアウトができるようになる。
最終的には<head>
から下を入れ替えることでエラーが出ず、以前のようにログアウトができるようになった。
なお、ログインと新規投稿については問題のあったソースコードでもできていた。
部分的に入れ替えてみたり色々試してみて数十分、記述を追加するとログアウトできるようになるものを発見。application.html.erb<%= csrf_meta_tags %> <%= csp_meta_tag %>この二つでした。
調べてみるとクロスサイトリクエストフォージュリに関する記述。
Railsがセキュリティ的に危ないからやめときなさい!と注意をしてくれているということでした。
ありがとうRailsさん、いつもエラーで怒ってごめんね。エラーが出なくなったソースコード(head以下を変更しました
application.html.erb<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <meta name="description" content=""> <meta name="author" content="Mark Otto, Jacob Thornton, and Bootstrap contributors"> <meta name="generator" content="Jekyll v4.0.1"> <title>Party Freak</title> <%= csrf_meta_tags %> ⬅️追加 <%= csp_meta_tag %> ⬅️追加 <%= stylesheet_link_tag 'application', media: 'all'%> <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %> ⬅️なぜかこれも追加 〜以下略〜一番下のJSを入れないとログアウトできなかったのが謎です。
何度やってもこれがないとダメなようですが理由がわかりません。
どなたか理由がわかる方がいらっしゃれば教えていただければ幸いです。
- 投稿日:2021-01-20T19:27:53+09:00
Ruby3.0でpostgresqlのgemがうまくインストールできない
Ruby3.0を試していたところ
postgresqlのgemのpgがうまくインストールできなかったので
記事を探していたら解決できたので備忘のために。私は下記issuesを参考に解決できました。感謝!!!
https://github.com/ged/ruby-pg/issues/365自分が実施した手順は以下。
$ ridk exec pacman -S mingw-w64-x86_64-postgresql 依存関係を解決しています... 衝突するパッケージがないか確認しています... パッケージ (18) mingw-w64-x86_64-bzip2-1.0.8-2 mingw-w64-x86_64-ca-certificates-20200601-2 mingw-w64-x86_64-libgcrypt-1.8.7-2 mingw-w64-x86_64-libgpg-error-1.41-3 mingw-w64-x86_64-libsystre-1.0.1-4 mingw-w64-x86_64-libtasn1-4.16.0-1 mingw-w64-x86_64-libtre-git-r128.6fb7206-2 mingw-w64-x86_64-libxml2-2.9.10-5 mingw-w64-x86_64-libxslt-1.1.34-2 mingw-w64-x86_64-mpdecimal-2.5.0-1 mingw-w64-x86_64-ncurses-6.2-2 mingw-w64-x86_64-openssl-1.1.1.i-1 mingw-w64-x86_64-p11-kit-0.23.21-4 mingw-w64-x86_64-python-3.8.7-2 mingw-w64-x86_64-tk-8.6.11-1 mingw-w64-x86_64-xz-5.2.5-2 winpty-0.4.3-1 mingw-w64-x86_64-postgresql-12.4-1 合計ダウンロード容量: 37.77 MiB 合計インストール容量: 284.64 MiB :: インストールを行いますか? [Y/n] y :: パッケージを取得します... mingw-w64-x86_64-xz-5.2.... 354.3 KiB 1247 KiB/s 00:00 [###############################] 100% mingw-w64-x86_64-libxml2... 1507.1 KiB 594 KiB/s 00:03 [###############################] 100% mingw-w64-x86_64-libgpg-... 311.7 KiB 518 KiB/s 00:01 [###############################] 100% mingw-w64-x86_64-libgcry... 660.4 KiB 739 KiB/s 00:01 [###############################] 100% mingw-w64-x86_64-libxslt... 436.8 KiB 973 KiB/s 00:00 [###############################] 100% mingw-w64-x86_64-libtasn... 172.0 KiB 717 KiB/s 00:00 [###############################] 100% mingw-w64-x86_64-p11-kit... 333.7 KiB 261 KiB/s 00:01 [###############################] 100% mingw-w64-x86_64-ca-cert... 349.8 KiB 732 KiB/s 00:00 [###############################] 100% mingw-w64-x86_64-openssl... 4.8 MiB 651 KiB/s 00:07 [###############################] 100% mingw-w64-x86_64-bzip2-1... 89.1 KiB 66.7 KiB/s 00:01 [###############################] 100% mingw-w64-x86_64-mpdecim... 344.4 KiB 906 KiB/s 00:00 [###############################] 100% mingw-w64-x86_64-libtre-... 84.2 KiB 108 KiB/s 00:01 [###############################] 100% mingw-w64-x86_64-libsyst... 24.0 KiB 1042 KiB/s 00:00 [###############################] 100% mingw-w64-x86_64-ncurses... 1578.1 KiB 1779 KiB/s 00:01 [###############################] 100% mingw-w64-x86_64-tk-8.6.... 1973.1 KiB 289 KiB/s 00:07 [###############################] 100% mingw-w64-x86_64-python-... 17.0 MiB 3.87 MiB/s 00:04 [###############################] 100% mingw-w64-x86_64-postgre... 7.5 MiB 437 KiB/s 00:18 [###############################] 100% winpty-0.4.3-1-x86_64 500.5 KiB 819 KiB/s 00:01 [###############################] 100% (18/18) キーリングのキーを確認 [###############################] 100% (18/18) パッケージの整合性をチェック [###############################] 100% (18/18) パッケージファイルのロード [###############################] 100% (18/18) ファイルの衝突をチェック [###############################] 100% (18/18) 空き容量を確認 [###############################] 100% :: パッケージの変更を処理しています... ( 1/18) インストール mingw-w64-x86_64-xz [###############################] 100% ( 2/18) インストール mingw-w64-x86_64-libxml2 [###############################] 100% ( 3/18) インストール mingw-w64-x86_64-libgpg-error [###############################] 100% ( 4/18) インストール mingw-w64-x86_64-libgcrypt [###############################] 100% ( 5/18) インストール mingw-w64-x86_64-libxslt [###############################] 100% ( 6/18) インストール mingw-w64-x86_64-libtasn1 [###############################] 100% ( 7/18) インストール mingw-w64-x86_64-p11-kit [###############################] 100% ( 8/18) インストール mingw-w64-x86_64-ca-certificates [###############################] 100% ( 9/18) インストール mingw-w64-x86_64-openssl [###############################] 100% (10/18) インストール mingw-w64-x86_64-bzip2 [###############################] 100% (11/18) インストール mingw-w64-x86_64-mpdecimal [###############################] 100% (12/18) インストール mingw-w64-x86_64-libtre-git [###############################] 100% (13/18) インストール mingw-w64-x86_64-libsystre [###############################] 100% (14/18) インストール mingw-w64-x86_64-ncurses [###############################] 100% (15/18) インストール mingw-w64-x86_64-tk [###############################] 100% (16/18) インストール mingw-w64-x86_64-python [###############################] 100% (17/18) インストール winpty [###############################] 100% (18/18) インストール mingw-w64-x86_64-postgresql [###############################] 100% $ gem install pg Temporarily enhancing PATH for MSYS/MINGW... Building native extensions. This could take a while... Successfully installed pg-1.2.3 Parsing documentation for pg-1.2.3 Done installing documentation for pg after 0 seconds 1 gem installed $ rails generate migration TestMigration invoke active_record create db/migrate/20210120095052_test_migration.rb
- 投稿日:2021-01-20T18:51:35+09:00
vscode の Ruby Test Explorer で minitest を動かすと NoMethodError: undefined method `klass' for ...
tl;dr
- minitest 5.10.1 を 5.14.1 に更新したら直った
- ref: https://github.com/connorshea/vscode-ruby-test-adapter/issues/20#issuecomment-668046280
環境
- VS Code Version: 1.52.1
- ruby 2.6.3 (rbenv)
- minitest (5.10.1)
はじめに
- 以下のようなサンプルの test を書く
test/test_import.rbrequire 'minitest/unit' require 'minitest/autorun' class TestFoo < MiniTest::Test def setup end def test_foo assert_equal 1, 1 end end
vscode + Ruby Test Explorer で試すと実行してるようだが、処理中のままになる
Settings で Ruby Test Explorer: Logpanel を True にし Ruby Test Explorer Log の OUTPUT を確認すると以下の通り
[2021-01-20 09:38:33.897] [INFO] Running command: bundle exec rake -R $EXT_DIR vscode:minitest:run 'test/test_import.rb:9' [2021-01-20 09:38:34.562] [DEBUG] [CHILD PROCESS OUTPUT] [2021-01-20 09:38:34.562] [DEBUG] [CHILD PROCESS OUTPUT] RUNNING: ./test/test_import.rb[9] [2021-01-20 09:38:34.563] [DEBUG] [CHILD PROCESS OUTPUT] rake aborted! [2021-01-20 09:38:34.564] [DEBUG] [CHILD PROCESS OUTPUT] NoMethodError: undefined method `klass' for #<TestFoo:0x00007fa8ad1c15f8> [2021-01-20 09:38:34.564] [DEBUG] [CHILD PROCESS OUTPUT] Did you mean? class [2021-01-20 09:38:34.564] [DEBUG] [CHILD PROCESS OUTPUT] /Users/murasawa/.vscode/extensions/connorshea.vscode-ruby-test-adapter-0.8.0/ruby/vscode/minitest/reporter.rb:66:in `vscode_result' [2021-01-20 09:38:34.564] [DEBUG] [CHILD PROCESS OUTPUT] /Users/murasawa/.vscode/extensions/connorshea.vscode-ruby-test-adapter-0.8.0/ruby/vscode/minitest/reporter.rb:27:in `record' [2021-01-20 09:38:34.564] [DEBUG] [CHILD PROCESS OUTPUT] /Users/murasawa/.vscode/extensions/connorshea.vscode-ruby-test-adapter-0.8.0/ruby/vscode/minitest/runner.rb:40:in `block in run' [2021-01-20 09:38:34.564] [DEBUG] [CHILD PROCESS OUTPUT] /Users/murasawa/.vscode/extensions/connorshea.vscode-ruby-test-adapter-0.8.0/ruby/vscode/minitest/runner.rb:39:in `each' [2021-01-20 09:38:34.564] [DEBUG] [CHILD PROCESS OUTPUT] /Users/murasawa/.vscode/extensions/connorshea.vscode-ruby-test-adapter-0.8.0/ruby/vscode/minitest/runner.rb:39:in `run' [2021-01-20 09:38:34.564] [DEBUG] [CHILD PROCESS OUTPUT] /Users/murasawa/.vscode/extensions/connorshea.vscode-ruby-test-adapter-0.8.0/ruby/vscode/minitest.rb:36:in `run' [2021-01-20 09:38:34.564] [DEBUG] [CHILD PROCESS OUTPUT] /Users/murasawa/.vscode/extensions/connorshea.vscode-ruby-test-adapter-0.8.0/ruby/vscode.rake:14:in `block (3 levels) in <top (required)>' [2021-01-20 09:38:34.564] [DEBUG] [CHILD PROCESS OUTPUT] /Users/murasawa/.anyenv/envs/rbenv/versions/2.6.3/bin/bundle:23:in `load' [2021-01-20 09:38:34.564] [DEBUG] [CHILD PROCESS OUTPUT] /Users/murasawa/.anyenv/envs/rbenv/versions/2.6.3/bin/bundle:23:in `<main>' [2021-01-20 09:38:34.564] [DEBUG] [CHILD PROCESS OUTPUT] Tasks: TOP => vscode:minitest:run [2021-01-20 09:38:34.564] [DEBUG] [CHILD PROCESS OUTPUT] (See full trace by running task with --trace) [2021-01-20 09:38:34.570] [INFO] Child process has exited. Sending test run finish event.結論
- https://github.com/connorshea/vscode-ruby-test-adapter/issues/20#issuecomment-668046280 のとおり 5.14.1 に上げたら直りました
- Gemfile に 書いて bundle install です。
Gemfilegem 'minitest', '5.14.1'
- 投稿日:2021-01-20T18:15:29+09:00
[個人開発]使い捨てチャットアプリ作ってみた
初めに
今回はweb上で動くチャットアプリ 「スコーチチャット」を作りました。
アカウント登録不要
ダウンロード不要
で使い捨てで使われることを想定してます。URL
https://scorch-chat.herokuapp.com/開発環境
rails6
ruby2.7
windows10
heroku
postgresql
ActionCablegem 'ridgepole'
gem 'slim-rails'
gem 'html2slim'
gem 'pry-rails'
gem 'bcrypt'
gem 'activeadmin'
gem 'devise'
gem 'rack-attack'いつもと同じです。
開発期間
5日くらいです。
webアプリは当たる確率が6%程で質より量を打ったほうがいいといわれたのでなるべく早く作りました。チャット画面
[自分流]新しい技術の勉強法
結論から言うと、元あるコードを改造することです。
初めて使う技術のコードを一気に書くのは難しいです。
なので作りたいアプリになるべく似たコードを
githubなどで落としてきてそれで開発を進めるんです。
するとインプットとアウトプットを実践でできるので
いい勉強法になると思ってます。今回はじめてActionCableを使ったのですが最初は全く分かりませんでしたがもう
何となくわかるようになりました終わりに
ここまで読んでくれてありがとうございました。
スコーチチャットをぜひ使ってみてください!
URL
https://scorch-chat.herokuapp.com/
- 投稿日:2021-01-20T18:15:29+09:00
使い捨てのチャットを作成できるサービス「Scorch Chat」をリリースした!
初めに
今回はweb上で動くチャットアプリ 「スコーチチャット」を作りました。
アカウント登録不要
ダウンロード不要
で使い捨てで使われることを想定してます。URL
https://scorch-chat.herokuapp.com/開発環境
rails6
ruby2.7
heroku
postgresql
ActionCable
slimいつもと同じです。
開発期間
5日くらいです。
webアプリは当たる確率が6%程で質より量を打ったほうがいいといわれたのでなるべく早く作りました。チャット画面
[自分流]新しい技術の勉強法
結論から言うと、元あるコードを改造することです。
初めて使う技術のコードを一気に書くのは難しいです。
なので作りたいアプリになるべく似たコードを
githubなどで落としてきてそれで開発を進めます。
するとインプットとアウトプットを実践でできるので
いい勉強法になると思ってます。今回はじめてActionCableを使ったのですが最初は全く分かりませんでしたがもう
何となくわかるようになりましたRailsはオワコンか?
ほかの記事で話題になっていたので取り上げます。
僕はrailsはオワコンではないと思います。
結構昔から言われ続けてますが、まだオワコンにはなってないでしょう?
それが答えな気がします。railsを圧倒するようなフレームワークが出ない限りオワコンにはならない気がします。
終わりに
ここまで読んでくれてありがとうございました。
スコーチチャットをぜひ使ってみてください!
URL
https://scorch-chat.herokuapp.com/
- 投稿日:2021-01-20T18:15:29+09:00
手軽にチャットを作成できるサービスをリリースした!
初めに
今回はweb上で動くチャットアプリ 「スコーチチャット」を作りました。
アカウント登録不要
ダウンロード不要
で使い捨てで使われることを想定してます。URL
https://scorch-chat.herokuapp.com/開発環境
rails6
ruby2.7
heroku
postgresql
ActionCable
slimいつもと同じです。
開発期間
5日くらいです。
webアプリは当たる確率が6%程で質より量を打ったほうがいいといわれたのでなるべく早く作りました。チャット画面
[自分流]新しい技術の勉強法
結論から言うと、元あるコードを改造することです。
初めて使う技術のコードを一気に書くのは難しいです。
なので作りたいアプリになるべく似たコードを
githubなどで落としてきてそれで開発を進めます。
するとインプットとアウトプットを実践でできるので
いい勉強法になると思ってます。今回はじめてActionCableを使ったのですが最初は全く分かりませんでしたがもう
何となくわかるようになりましたRailsはオワコンか?
ほかの記事で話題になっていたので取り上げます。
僕はrailsはオワコンではないと思います。
結構昔から言われ続けてますが、まだオワコンにはなってないでしょう?
それが答えな気がします。railsを圧倒するようなフレームワークが出ない限りオワコンにはならない気がします。
終わりに
ここまで読んでくれてありがとうございました。
スコーチチャットをぜひ使ってみてください!
URL
https://scorch-chat.herokuapp.com/
- 投稿日:2021-01-20T17:53:35+09:00
PayjpでのInvalidRequestErrorについて
Payjpのカード決済機能の導入中にエラーが出現
Payjp::InvalidRequestError
今回はこちらについてやっていこうと思います。
(ちなみにapi_key = ENV[〜〜]の記述は環境変数となっています。ご自身で設定してる値になります。)まずエラーの内容の把握
InvalidRequestErrorとは:
無効なリクエスト、という意味。ではその下の
Missing required param to chargeとは:
missing_paramというのが必要なパラメータがセットされていないと出るものすなわち、この場合chargeに必要なパラメータがないよ。という意味になります。
慣れている人からすればすんなり解決できるのでしょうが、よくわからなかったので、そのまま下に進むと
という記述。
ここでステータスコードについてのおさらい
ステータスコード 内容 100~ 処理を継続中 200~ 成功 300~ リダイレクト 400~ クライアント側のエラー 500~ サーバー側のエラー 厳密にはもっと細かいですが大雑把にはこんな感じ
今回はステータスコード400ということでクライアント側が問題なのでは?と仮説を立てた。
まず仮説1つ目はform_withのmodelやurlの記載ミス
仮説2つ目は・・・・・なんて数時間過ごした結果全て無駄なことでした。
原因
ステータスコードより見なければいけないところがありました。
amount: user_order_params[:price], card: user_order_params[:token], currency: 'jpy'の部分。
出品者が定めた金額を支払って購入する設定なので、金額を直接入力し送信したわけではないためにこちらのuser_order_paramsにはpriceの情報はありません。
ここがエラーの原因となってました。解決法
今実装している機能において、priceという値はitemsテーブルという場所に保存するようになっています。
よって、amount: user_order_params[:price], ↓ amount: @item.price,これで無事解決しました。
終わりに
最後駆け足になってしまいましたが、理由は修正後にこの記事を書いていることにあります。
簡単にいうと、記事を書くために無理にエラー文を出して、元のコードがわからなくなったら困るからです。次回は修正経過もきっちりとメモしたり、画像キャプチャですしながら進めたいです。
という反省でした。
- 投稿日:2021-01-20T14:32:08+09:00
Ruby on Railsでwysiwygエディタのgem「summernote」 実装方法
Ruby on Railsでwysiwygエディタのgem「summernote」 実装方法
wysiwygエディタをgem「summernote」を用いて実装した際、なんとなくで実装してしまっていたため、改めてここに書いておこうと思います。
summernote
作成するもの
・gem「summernote」を用いて記事投稿できる機能
・gem「public_uid」を用いて記事のIDはqiitaの記事の様にランダムの文字列にする①リッチテキストエディタ作成手順
STEP1 : gem をインストール
Gemfilegem 'summernote-rails' gem 'jquery-rails' gem 'bootstrap'bundle installSTEP2 : Modelを作成
各種名前は任意で
rails g model article title:string message:textSTEP3 : scssの準備
application.scss@import "bootstrap"; @import "summernote-bs4";STEP3 : jsの準備
application.js//= require jquery //= require jquery_ujs //= require popper //= require bootstrap //= require summernote/summernote-bs4.min //= require summernote-init //= require activestorage //= require turbolinks //= require_tree .STEP4: 入力formの作成
※bootstrapを利用しています。HTML/CSS部分については各自お好きな様にコーディングください。
_form.html.erb<%= form_with model: @article,local: true do|f| %> <div class="form-group"> <label class="label-leftline">タイトルを入力して下さい</label> <%= f.text_field :title , value:@article.title ,class:"form-control" ,placeholder: "記事のタイトルを入力します" %> </div> <div class="row"> <div class="col-12 col-sm-9"> <div class="form-group"> <label class="label-leftline">本文を入力しましょう</label> <%= f.text_area :message ,value:@article.message,'data-provider': :summernote,id:"summernote"%> </div> <div id="question-register-button-div" class="text-center"> <%= f.submit "投稿", class:"btn" %> </div> </div> </div> <% end %>STEP5: 入力画面の作成
new.html.erb<div class="container"> <div class="row"> <div class="col-12"> <div> <h1>新規作成</h1> </div> <%= render 'form' %> </div> </div> </div>これでリッチテキストエディタが表示されるはず!
なぜかリッチテキストエディタが表示されない場合
全く表示されない場合
全く表示されなく、困っている際、scriptを記載し解消したことがあります。
よろしければやってみてください。
※もし、表示されない根本的な原因と解決策について、ご存知な方がいらっしゃいましたらご教授いただけますと幸いです。_form.html.erb<script> $(document).ready(function() { $('#summernote').summernote({ placeholder: '記事本文を入力しましょう', tabsize: 3, height: 500 }); }); </script> ・・・・ <%= f.text_area :message ,value:@article.message,class: "article_content",style: "width: 100%;" %> ・・・・更新しないと表示されない場合
この場合、turbolinksが悪さをしている可能性があります。
※turbolinksについて詳しいのはこちらの記事が参考にどうぞ
Turbolinksってなんぞ今回の話で大事なのは「通常であればページが読み込まれたタイミングで load イベントが発生しますが、Turbolinks によって画面が切り替わった場合は load イベントは発生しません。」というところです
summernoteでは画面表示時にjqueryで反映させますので、turblinksがあるとそれが機能せず開いた時に表示されない・・・何故かリロードすると表示される・・・という現象に陥ります。
そのため、このトラブルに対してはturbolinksを無効化してみましょう。参考サイト
【Rails】turbolinksを無効化する方法
私は参考サイト先に習って、部分的に入力ページだけturbolinksを無効化しています記入ページに遷移する前のhtml.erb<!--'data-turbolinks': false を link_toに追加 --> <%= link_to "記事新規作成へ",new_article_path ,class: "btn",'data-turbolinks': false %>②リッチテキストエディタで作成したレコード(記事)のURLに表示されるIDをqiitaの記事の様にランダムの文字列にする手順
STEP1 : gem をインストール
Gemfilegem 'public_uid'STEP2 : モデルにpublic_uid用のカラムを追加する
$ rails g migration AddPublicUidToArticle public_uid:string〇〇.rbclass AddPublicUidToArticle < ActiveRecord::Migration[6.0] def change add_column :articles, :public_uid, :string add_index :articles, :public_uid, unique: true end endマイグレーションファイルにpublic_uidへのindexを指定します。
$ rails db:migrateSTEP3: モデルにpublic_uidを自動生成するコードを追記
/app/models/article.rbclass Article < ApplicationRecord generate_public_uid end対象のモデルファイルに「generate_public_uid」というコードを追加するだけで完了です。
このコードによってモデルがDBに登録されるタイミングで自動的にpublic_uidに8桁のランダムな文字列が登録される様になります。STEP4: to_paramメソッドをオーバーライド
/app/models/article.rbclass Article < ApplicationRecord generate_public_uid def to_param public_uid end endto_paramメソッドをオーバーライドし、URLの:idを:public_uidに変更します。
完成!!
参考ページ
- 投稿日:2021-01-20T13:19:37+09:00
gem install cocoapods に 失敗('ruby/config.h' file not found)
少しハマったので備忘録として残しておきます。
環境
MacOS : Big Sur 11.1 (20C69)
Xcode : Version 12.3 (12C33)経緯
pod コマンドを使用したところ、cocoapodsをアップデートしてねと言われる
% pod outdated Ignoring ffi-1.13.1 because its extensions are not built. Try: gem pristine ffi --version 1.13.1 Ignoring iStats-1.6.1 because its extensions are not built. Try: gem pristine iStats --version 1.6.1 Updating spec repo `trunk` CocoaPods 1.10.1 is available. To update use: `sudo gem install cocoapods` :エラー内容
ほいほいとアップデート実行すると以下のエラーが発生
% sudo gem install cocoapods Password: Ignoring ffi-1.13.1 because its extensions are not built. Try: gem pristine ffi --version 1.13.1 Ignoring iStats-1.6.1 because its extensions are not built. Try: gem pristine iStats --version 1.6.1 ERROR: Error installing cocoapods: ERROR: Failed to build gem native extension. current directory: /Library/Ruby/Gems/2.6.0/gems/ffi-1.13.1/ext/ffi_c /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/bin/ruby -I /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0 -r ./siteconf20210120-82832-1x09kaf.rb extconf.rb checking for ffi.h... /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/mkmf.rb:467:in `try_do': The compiler failed to generate an executable file. (RuntimeError) You have to install development tools first. from /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/mkmf.rb:585:in `block in try_compile' from /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/mkmf.rb:534:in `with_werror' from /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/mkmf.rb:585:in `try_compile' from /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/mkmf.rb:1109:in `block in have_header' from /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/mkmf.rb:959:in `block in checking_for' from /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/mkmf.rb:361:in `block (2 levels) in postpone' from /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/mkmf.rb:331:in `open' from /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/mkmf.rb:361:in `block in postpone' from /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/mkmf.rb:331:in `open' from /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/mkmf.rb:357:in `postpone' from /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/mkmf.rb:958:in `checking_for' from /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/mkmf.rb:1108:in `have_header' from extconf.rb:10:in `system_libffi_usable?' from extconf.rb:42:in `<main>' To see why this extension failed to compile, please check the mkmf.log which can be found here: /Library/Ruby/Gems/2.6.0/extensions/universal-darwin-20/2.6.0/ffi-1.13.1/mkmf.log extconf failed, exit code 1 Gem files will remain installed in /Library/Ruby/Gems/2.6.0/gems/ffi-1.13.1 for inspection. Results logged to /Library/Ruby/Gems/2.6.0/extensions/universal-darwin-20/2.6.0/ffi-1.13.1/gem_make.out
/Library/Ruby/Gems/2.6.0/extensions/universal-darwin-20/2.6.0/ffi-1.13.1/mkmf.log
上記のエラーログを見てねと言われる。/Library/Ruby/Gems/2.6.0/extensions/universal-darwin-20/2.6.0/ffi-1.13.1/mkmf.logpackage configuration for libffi is not found "xcrun clang -o conftest -I/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/universal-darwin20 -I/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/backward -I/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -Os -pipe -DHAVE_GCC_ATOMIC_BUILTINS -DUSE_FFI_CLOSURE_ALLOC conftest.c -L. -L/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib -L. -L/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.1.Internal.sdk/usr/local/lib -lruby.2.6 " In file included from conftest.c:1: In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby.h:33: /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:24:10: fatal error: 'ruby/config.h' file not found #include "ruby/config.h" ^~~~~~~~~~~~~~~ /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:24:10: note: did not find header 'config.h' in framework 'ruby' (loaded from '/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks') 1 error generated. checked program was: /* begin */ 1: #include "ruby.h" 2: 3: int main(int argc, char **argv) 4: { 5: return 0; 6: } /* end */対処方法
Xcode の設定(Preferences)から「Locations」タブを開く
「Command Line Tools」が空だったので 「Xcode 12.3(12C33)」を選択上記の設定を行い、再度
sudo gem install cocoapods
を実行したところ無事インストール完了しました。参考
https://stackoverflow.com/questions/26434642/yosemite-upgrade-broke-ruby-h
- 投稿日:2021-01-20T09:31:22+09:00
(2021年)Ruby on Rails 管理者(admin)ログイン作成
前提条件
- deviseでcosutomerログインできること
ターミナル$ rails g devise Admin $ rails db:migrateadminでログインするユーザー作成する。
db/seeds.rbAdmin.create!( email: 'admin@admin', password: 'testtest' )ターミナル$ rails db:seedadminのユーザーデータが入っているか確認する。
ターミナル$ rails c $ irb(main):001:0> Admin.all $ irb(main):002:0> exit次はviewとcontrollerの作成します。
ターミナル$ rails g devise:views admins $ rails g devise:controllers adminsルーティングを編集をします。
config/routes.rbdevise_for :admins ↓ devise_for :admins, controllers: { sessions: 'admins/sessions' }ログイン後のヘッダー画面を追加します。
application.html.erb<% if customer_signed_in? %> <li> <%= link_to "ログアウト", destroy_customer_session_path, method: :delete %> </li> <% elsif admin_signed_in? %> <li> <%= link_to "ログアウト", destroy_admin_session_path, method: :delete %> </li> <% else %> <li> <%= link_to "新規登録", new_customer_registration_path %> </li> <li> <%= link_to "ログイン", new_customer_session_path %> </li> <% end %>管理者のログイン後ページ遷移とログアウト先を作成します。
controllers/admins/sessions_contoller.rbprotected def after_sign_in_path_for(resource) admin_items_path end def after_sign_out_path_for(resource) new_admin_session_path end
- 投稿日:2021-01-20T09:23:20+09:00
Rails がオワコンwww
はじめに
※ この文章はベータ版です。
Yahoo!知恵袋にあった間違いだらけのベストアンサーがあまりにも...だった
ので書いています。
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10236599945このベストアンサーの問題点
著者が、よく知りもしない情報について、きちんと調べもせず、以前、聞き齧ったorどこかで
読んだような気がする、うろ覚えの情報をベースに、回答しているようにしか見えない。自分がうろ覚えの情報で回答することで、ネット上に誤情報をばら撒く可能性を考えていない
時点で、自分はこの著者が技術屋or技術屋を目指す人間なら、アウトと評価します。(この著者、「はず」「と思う」を多用することで、うろ覚えの情報で回答していますよアピールを
している気が、、、うろ覚えの情報で回答していることに、何ら問題を感じていないようにみえます、
自分のうろ覚えの情報が間違っていた時のための予防線を張っているようにも。。。「はず」「と思う」が多用されていても、質問者や読者が正しい情報と誤認識する可能性があります、
「はず」「と思う」を付けたからと誤情報かもしれない、うろ覚えの情報で書いてもいい、と考える
のは間違いです。この質問の質問者は、うろ覚えで書かれた誤情報を正しい情報と、誤認識してしまっている気がします。)
ネット上で書く以上、うろ覚えの情報で書くのではなく、自分のうろ覚えの情報が正しいか、
ネット上で最新情報をキャッチアップし、その情報と照らし合わせて検証してから、正しい情報
をベースに書くべきです、エンジニアなら尚更。Qiita etcに投稿する際も同様です。(この質問、2021/01/01 に投稿され、その日のうちに締め切られいて、
間違いだらけのベストアンサーを別の回答で正すこともできない状態に
なっています。うがった見方をすれば、質問の投稿者とベストアンサーの著者が同じ人間で、
わざと間違った情報をネット上に意図的に晒している、とも受け取れます。)Ruby自体、時代にあわせた変化や進化はもうない(と思います)
Ruby3.0.0で、
型チェック用基盤の RBS/TypeProfと、
並行・並列処理の Ractor & Fiber Scheduler
が入ってますけど。。。まだ実験的機能ではあるものの、Ruby2.6からJITが入り、Ruby3.0でも
改良が続けられてますが、、、時代の要請に合わせた新機能ですよね、、、
言語仕様ではなく実行環境の新機能ですけど。。。
(3.0.0でも、Railsとの組み合わせでパフォーマンスがおちる場合がまだ
多々あり、実戦投入できるレベルには達していないという判断?でデフォルト
ではoffになっています。)Ruby3.0.0、他にも新機能あります。
https://techlife.cookpad.com/entry/2020/12/25/155741「Ruby 新機能」でググれば、すぐにキャッチアップできる情報。。。
Ruby原作者のMatz氏が発言していたのは、構文の大きな変更はしない、
であって、、、言語の大きな変更はしない、ではない、です。Matz氏は、公式に、Rubyを時代にあわせて変化・進化させていくニュアンスの
発言をしています。(Rubyは、1.8→1.9→2.0(8年近く前の2013/02にリリース)、で、かなり大きな
痛みを伴う変更が入って、実行環境の実装もそれまでのインタープリタから
バイトコード・インタープリタに置き換えられています。2.xへの移行は、Railsが
割と短期間で2.xに対応したこともあり、わりと短期間(数年?)で完了したように
感じています。Pythonは 2.x→3.x で、多岐に渡る、かなり大きな?変更が入って、
3.0が12年ちょい前の2008/12にリリースされましたが、2.7が2020/01に
EOF(End Of Life)になったにもかかわらず広く利用されていて、
3.xへの移行は完了していません。例えば、Google Chromeのビルドツールであるgnは未だに2.7?で
書かれたままで、3.xに移行する気配はないようです。Perlは5.x→6.0で大きすぎる痛みを伴う変更が計画?されましたが、
6.0の開発は何年も停滞して、ある程度、実装が進んだ頃に、結局、
Perl6.0→Rakuとリネームされ、別の言語になりました。言語仕様への大きな変更は、大きな痛みを伴う(ユーザーに大きな痛みを
強いる)ので、ユーザーの要望に応える形での変更でもない限り、
ユーザーに痛み以上のメリットを提示できないと、移行が進まないよう
です、ので、仕様の策定者は実施前に熟考に熟考を重ねる、と共に
ユーザーの声を聞く必要があるようです。)「Railsはオワコン」の問題点
上記のベストアンサーのように、聞き齧った、どこかで読んだ気がする、うろ覚えの情報
を基に「Railsはオワコン」と、書かれたり、言われたり、していることが多い気がします。Ruby / Rails はオワコンなのか?
Rubyでは、Rails登場以前に、これといったウェブ・アプリケーション・フレームワーク(WAF)
がなく、Rails登場 により、はじめて、RubyがWEBアプリ開発の選択肢の一つになりました。Railsの完成度が初期から割と高く、時代の変化に対応しながらバージョンアップしてきたこと
もあり、Rails以外のWAFが登場しても、Railsを超えるorRailsと並ぶ完成度のモノはなかった
ので、RailsがRubyのWAFのデファクトであり続けてきました。デファクトであるRailsによるエコシステムが醸成され、WAFの再発明をしたり、他のWAF用の
ライブラリを開発するよりも、Rails用のライブラリを開発したほうが世の中で広く使われる
状況になっているので、今もRails用のライブラリが多数開発され続けています。PHPやPythonのように同じような完成度のWAFが多数あると、同じ用途用のライブラリが
WAF毎に存在し、GitHubでのプロジェクトの数も必然的に多くなります。Rubyの場合、WAFの開発まわりがほぼRailsに集約されているので、同じ用途のRails用
ライブラリが複数あっても、PHPやPythonに比べてWAF関連のGitHubプロジェクト数は
少なくなっています。なので、Ruby / Rails のGithubでのプロジェクト数が PHP / Python と比べて少ない
ことを「Ruby / Railsはオワコン」の根拠の一つに挙げるのはナンセンスですね。ちなみに、みんな大好き?GitHub、Rails (Ruby) で構築されています。
https://www.publickey1.jp/blog/19/githubrails_69.html昨日(2021/01/19)、Google Cloud FunctionsでのRubyのサポートが発表されています。
https://www.publickey1.jp/blog/21/google_cloud_functionsruby.htmlつづく&推敲中...
Rails のフロントエンドまわり
Railsのフロントエンドまわりがレガシーにみえることが「Ruby / Rails オワコン」
の根拠の一つになっている気がするので、書いてみます。今でも偶に、rails-us と remote: true とjs.erbの組み合わせでAjax化するコードを、
Qiita etcの新しい記事で見かけますが、昔、書かれたコードをメンテナンスしている人でも
ない限り、Railsのプロジェクトで見掛けることは、ほとんど、なくなっています。Railsに含まれている機能のみ?でフロントエンドを構築するのは、最早、最適解
ではなく、レガシーなスタイルになっています。Webpacker経由で、Vue.js、React、etcのクライアントサイドJSフレームワーク
と組み合わせて、フロントエンドを構築することが主流になっています。DHHは先月、Turbolinksの発展系Turbo(JS)、クライアントJSフレームワーク
Stimulus2.0、とRailsを組み合わせた、新たな仕組み、Hotwire を発表しました。
現在はベータ版です。Hotwire
https://hotwire.dev
速報: Basecampがリリースした「Hotwire」の概要
https://techracho.bpsinc.jp/hachi8833/2020_12_24/102368HowireがRailsの1機能になるのか、Railsとは別に提供されるのか、は現在不明です。
たぶん、Railsとは別に提供されます。
(Turbo、TurbolinksがTurboの発表にあわせメンテナンス・モードに入ったため、
既存のTurbolinksを利用したRailsアプリのためにTurbo Drive(Turbolinksに相当)が
Railsに含まれる必要があるので、Railsに含まれるようになるはずです。)Railsに含まれている機能のみ?で構築されたレガシーなフロントエンドを低コストで
モダンにできることを売り?にしているようです。Hotwire は、rails-ujs + remote: true + js.erb の組み合わせと同じように、
jsonではなくhtml(のコード片)を用います、rails-ujs + remote: true + js.erb
の発展型(進化型)といえる、と思います。Railsしか触ったことのないエンジニアの多いプロジェクトで、Hotwire、流行る、
と思います。推敲中&つづく...
- 投稿日:2021-01-20T03:10:00+09:00
M1のmacに変えたらbundle installできなくなった件
先日、M1のmacbook proが届いて「さぁこれでairにイライラする生活ともおさらばだ!」とウキウキで環境構築していたらbundle installの段階で謎のerrorが出て余計にイライラすることになりました。
「新年早々...」と思いつつ色々調べた結果、なんと解決できたのでメモ程度に共有させていただきます。
エラーについて
※すぐにエラー内容が開けなかったため概要だけにさせてください。覚えていたら追記します。
エラーで詰まるまで以下の手順を踏みました。
・githubからrailsプロジェクトをローカルにclone
・bundle install
そして、エラーを起こしたgemは私が確認した限りでは以下のものでした。- ffi - sassc解決方法
私の環境では以下の手順で解決しました。
Finder>アプリケーション>ターミナル(右クリック)>情報を見る>「Rosettaを使用して開く」にチェック
まとめ
これは他の調べものをしていた際にたまたま見つけた解決方法でした。
一応、以下に本件に関連のありそうなappleのサポートページを載せておきます。
Mac に Rosetta をインストールする必要がある場合
- 投稿日:2021-01-20T02:33:36+09:00
migrate出来なかった時のお話
凡ミスでmigrate出来なかった時のお話
上記の5段構成で進めていきます。
本題に急いでいる方は
本題のerror発生から飛んで下さい。
以降、一部補足をしながら進めていきます。rails g modelコマンド
rails g modelコマンド
でモデルを作成したとき、
db/migrate/ディレクトリにmigrationファイルが同時に生成
される。migrationファイルの中身はこんな感じ
db/migrate/20XXXXXXXXXXXX_create_複数形のモデル名.rbclass Createモデル名の複数形 < ActiveRecord::Migration[6.0] def change create_table :モデル名の複数形 do |t| t.timestamps end end end
% rails g model 単数形モデル名
generateの略で、生成するの意味がある。
基本的に、コントローラー名は複数形、モデル名はそれに対応する単語の単数形になる。補足情報 :
% rails d model 単数形モデル名
destroyの略で、削除するの意味がある。
rails db:migrateコマンド
migrationファイルにデータベースに保存したい
カラムの型とカラム名を指定
して、
% rails db:migrate
とコマンドを打ち込みmigrationを実行する流れになるのだが...
% rails db:migrate
この動作は、マイグレートと呼ばれることがある。migrationが実行できない
migrationが実行できず、ターミナルには以下のerror文が...
== 20210119052352 CreateAddresses: migrating ================================== -- create_table(:addresses) rails aborted! StandardError: An error has occurred, all later migrations canceled: undefined method `steing' for #<ActiveRecord::ConnectionAdapters::MySQL::TableDefinition:0x00007fbc8955f760> Did you mean? string ~~省略~~ bin/rails:3:in `load' bin/rails:3:in `<main>' Caused by: NoMethodError: undefined method `steing' for #<ActiveRecord::ConnectionAdapters::MySQL::TableDefinition:0x00007fbc8955f760> NoMethodError: undefined method `steing' ~~省略~~ bin/rails:3:in `load' bin/rails:3:in `<main>' Tasks: TOP => db:migrate (See full trace by running task with --trace)errorの仮設・検証スタート
長々と出てきましたが、現状の私が着目したのは以下の3点
1. StandardError: An error has occurred, all later migrations canceled:` 2. undefined method `steing' for # 3. Did you mean? stringカラムの型を指定した際に手打ちしていた事によってスペルミスの可能性が浮上してきました。
追求はしませんでしたが、
StandardError
とある上記のerror文に関しても
こうして整理していくと気になってくる。検索結果 :
rails db:migrate:reset
データベースのリセットを行ってerror解決している記事を発見。
だが、今回の場合Did you mean? string
の表記が
決め手になっていた様に捉えて間違いなかったようだ。解決
この後migrationファイルを見直して予想通り
steing
を発見。== 20210119052352 Createモデル名の複数形: migrating ================================== -- create_table(:モデル名の複数形) -> 0.3171s == 20210119052352 CreateAddresses: migrated (0.3174s) =========================無事migration完了
もし仮にカラム名を間違っていたらerrorも吐かれずrollbackしていた事でしょう。