20210120のRubyに関する記事は16件です。

railsで検索機能を実装する方法(複数カラムも対応)

開発環境

Mac OS Catalina 10.15.7
ruby 2.6系
rails 6.0系

前提

前提として、現在私が作っている、記事を投稿できるアプリを例に説明します。
私はモデル名はpostモデルとしています。(参考にする際は、自分用に置き換えてください。)

ルーティング設定

まずはルーティングを設定します。
今回はsearchアクションという、基本アクション(index,new,create,show,edit,update,destroy)以外のアクションを定義する必要があるため、collectionを使い設定します。

routes.rb
Rails.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
end

collectionを使うと、ルーティングのURLと実行されるコントローラーを任意にカスタムできます。
また、ルーティングにidを含めたいときはmemberが使えます。

routes.rb
member 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.rb
class 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.rb
def 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における検索機能の実装方法です。
参考になれば幸いです。

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

rails test がデータベースの参照エラーで失敗する

経緯

Docker の中で Rails と MySQL を立て、 rails test でテストを実行しようとしたところ、エラーとなりました。

docker-compose.yml
services:
  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

これで動作します。

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

Ruby Gem Code Reading settingslogic 編その1

背景

この記事を読んで、コードリーディングしながらRubyの知識深めようと思ったため
https://blog.freedom-man.com/try-rubygem-codereading

対象

settinglogic

コードを読む準備をする

対象の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:NilClass

opensslのリンクがおかしくなっているのが原因らしく、こちらの記事を参考に修正
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 < Hash

Hashクラスを継承しているらしい

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.yaml
defaults: &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:
  <<: *defaults
setting.rb
require 'settingslogic'

class Settings < Settingslogic
  source File.expand_path("../settings.yml", __FILE__)
  namespace ENV['ENV']
end
sample.rb
require 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行もないので割ととっつきやすい。

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

【Bootstrap】いきなりログアウトできなくなった〜なんでや?CSRF問題らしい〜

解決したいこと

Bootstrapを導入してからログアウトができなくなってしまった。

発生している問題・エラー

ログイン後、ヘッダー部分にあるログアウトボタンを押すとエラーメッセージが出て、一生ログアウトできない。

a746095752c272c27d28d5b332bbf41f.png

該当するソースコード

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を入れないとログアウトできなかったのが謎です。
何度やってもこれがないとダメなようですが理由がわかりません。
どなたか理由がわかる方がいらっしゃれば教えていただければ幸いです。

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

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

vscode の Ruby Test Explorer で minitest を動かすと NoMethodError: undefined method `klass' for ...

tl;dr

環境

  • VS Code Version: 1.52.1
  • ruby 2.6.3 (rbenv)
  • minitest (5.10.1)

はじめに

  • 以下のようなサンプルの test を書く
test/test_import.rb
require '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.

結論

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

[個人開発]使い捨てチャットアプリ作ってみた

初めに

今回はweb上で動くチャットアプリ 「スコーチチャット」を作りました。
アカウント登録不要
ダウンロード不要
で使い捨てで使われることを想定してます。

chat-top.png
パスワードも設定可能です

URL
https://scorch-chat.herokuapp.com/

開発環境

rails6
ruby2.7
windows10
heroku
postgresql
ActionCable

gem 'ridgepole'
gem 'slim-rails'
gem 'html2slim'
gem 'pry-rails'
gem 'bcrypt'
gem 'activeadmin'
gem 'devise'
gem 'rack-attack'

いつもと同じです。

開発期間

5日くらいです。
webアプリは当たる確率が6%程で質より量を打ったほうがいいといわれたのでなるべく早く作りました。

チャット画面

chat-smart.png

[自分流]新しい技術の勉強法

結論から言うと、元あるコードを改造することです。

初めて使う技術のコードを一気に書くのは難しいです。
なので作りたいアプリになるべく似たコードを
githubなどで落としてきてそれで開発を進めるんです。
するとインプットとアウトプットを実践でできるので
いい勉強法になると思ってます。

今回はじめてActionCableを使ったのですが最初は全く分かりませんでしたがもう
何となくわかるようになりました

終わりに

ここまで読んでくれてありがとうございました。

スコーチチャットをぜひ使ってみてください!
URL
https://scorch-chat.herokuapp.com/

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

使い捨てのチャットを作成できるサービス「Scorch Chat」をリリースした!

初めに

今回はweb上で動くチャットアプリ 「スコーチチャット」を作りました。
アカウント登録不要
ダウンロード不要
で使い捨てで使われることを想定してます。

chat-top.png
パスワードも設定可能です

URL
https://scorch-chat.herokuapp.com/

開発環境

rails6
ruby2.7
heroku
postgresql
ActionCable
slim

いつもと同じです。

開発期間

5日くらいです。
webアプリは当たる確率が6%程で質より量を打ったほうがいいといわれたのでなるべく早く作りました。

チャット画面

chat-smart.png

[自分流]新しい技術の勉強法

結論から言うと、元あるコードを改造することです。

初めて使う技術のコードを一気に書くのは難しいです。
なので作りたいアプリになるべく似たコードを
githubなどで落としてきてそれで開発を進めます。
するとインプットとアウトプットを実践でできるので
いい勉強法になると思ってます。

今回はじめてActionCableを使ったのですが最初は全く分かりませんでしたがもう
何となくわかるようになりました

Railsはオワコンか?

ほかの記事で話題になっていたので取り上げます。

僕はrailsはオワコンではないと思います。
結構昔から言われ続けてますが、まだオワコンにはなってないでしょう?
それが答えな気がします。

railsを圧倒するようなフレームワークが出ない限りオワコンにはならない気がします。

終わりに

ここまで読んでくれてありがとうございました。

スコーチチャットをぜひ使ってみてください!
URL
https://scorch-chat.herokuapp.com/

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

手軽にチャットを作成できるサービスをリリースした!

初めに

今回はweb上で動くチャットアプリ 「スコーチチャット」を作りました。
アカウント登録不要
ダウンロード不要
で使い捨てで使われることを想定してます。

chat-top.png
パスワードも設定可能です

URL
https://scorch-chat.herokuapp.com/

開発環境

rails6
ruby2.7
heroku
postgresql
ActionCable
slim

いつもと同じです。

開発期間

5日くらいです。
webアプリは当たる確率が6%程で質より量を打ったほうがいいといわれたのでなるべく早く作りました。

チャット画面

chat-smart.png

[自分流]新しい技術の勉強法

結論から言うと、元あるコードを改造することです。

初めて使う技術のコードを一気に書くのは難しいです。
なので作りたいアプリになるべく似たコードを
githubなどで落としてきてそれで開発を進めます。
するとインプットとアウトプットを実践でできるので
いい勉強法になると思ってます。

今回はじめてActionCableを使ったのですが最初は全く分かりませんでしたがもう
何となくわかるようになりました

Railsはオワコンか?

ほかの記事で話題になっていたので取り上げます。

僕はrailsはオワコンではないと思います。
結構昔から言われ続けてますが、まだオワコンにはなってないでしょう?
それが答えな気がします。

railsを圧倒するようなフレームワークが出ない限りオワコンにはならない気がします。

終わりに

ここまで読んでくれてありがとうございました。

スコーチチャットをぜひ使ってみてください!
URL
https://scorch-chat.herokuapp.com/

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

PayjpでのInvalidRequestErrorについて

Payjpのカード決済機能の導入中にエラーが出現

Image from Gyazo

Payjp::InvalidRequestError
今回はこちらについてやっていこうと思います。
(ちなみにapi_key = ENV[〜〜]の記述は環境変数となっています。ご自身で設定してる値になります。)

まずエラーの内容の把握

InvalidRequestErrorとは:
無効なリクエスト、という意味。

ではその下の
Missing required param to chargeとは:
missing_paramというのが必要なパラメータがセットされていないと出るもの

すなわち、この場合chargeに必要なパラメータがないよ。という意味になります。

慣れている人からすればすんなり解決できるのでしょうが、よくわからなかったので、そのまま下に進むと

Image from Gyazo

という記述。

ここでステータスコードについてのおさらい

ステータスコード 内容
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,

これで無事解決しました。

終わりに

最後駆け足になってしまいましたが、理由は修正後にこの記事を書いていることにあります。
簡単にいうと、記事を書くために無理にエラー文を出して、元のコードがわからなくなったら困るからです。

次回は修正経過もきっちりとメモしたり、画像キャプチャですしながら進めたいです。
という反省でした。

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

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 をインストール

Gemfile
gem 'summernote-rails'
gem 'jquery-rails'
gem 'bootstrap'
bundle install

STEP2 : Modelを作成

各種名前は任意で

rails g model article title:string message:text

STEP3 : 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 をインストール

Gemfile
gem 'public_uid'

STEP2 : モデルにpublic_uid用のカラムを追加する

$ rails g migration AddPublicUidToArticle public_uid:string
〇〇.rb
class 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:migrate

STEP3: モデルにpublic_uidを自動生成するコードを追記

/app/models/article.rb
class Article < ApplicationRecord
  generate_public_uid
end

対象のモデルファイルに「generate_public_uid」というコードを追加するだけで完了です。
このコードによってモデルがDBに登録されるタイミングで自動的にpublic_uidに8桁のランダムな文字列が登録される様になります。

STEP4: to_paramメソッドをオーバーライド

/app/models/article.rb
class Article < ApplicationRecord
  generate_public_uid

  def to_param
    public_uid
  end

end

to_paramメソッドをオーバーライドし、URLの:idを:public_uidに変更します。

完成!!

参考ページ

【Rails】summernoteを使って画像も投稿できるブログを作る

【Rails】URLでidの代わりにランダムな文字列を表示させる

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

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.log
package 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)」を選択

スクリーンショット 2021-01-20 13.12.30.png

上記の設定を行い、再度 sudo gem install cocoapodsを実行したところ無事インストール完了しました。

参考

https://stackoverflow.com/questions/26434642/yosemite-upgrade-broke-ruby-h

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

(2021年)Ruby on Rails 管理者(admin)ログイン作成

前提条件

  • deviseでcosutomerログインできること
ターミナル
$ rails g devise Admin
$ rails db:migrate

adminでログインするユーザー作成する。

db/seeds.rb
Admin.create!(
   email: 'admin@admin',
   password: 'testtest'
)
ターミナル
$ rails db:seed

adminのユーザーデータが入っているか確認する。

ターミナル
$ 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.rb
devise_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.rb
protected
  def after_sign_in_path_for(resource)
    admin_items_path
  end

  def after_sign_out_path_for(resource)
    new_admin_session_path
  end
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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/102368

Howireが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、流行る、
と思います。

推敲中&つづく...

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

M1のmacに変えたらbundle installできなくなった件

先日、M1のmacbook proが届いて「さぁこれでairにイライラする生活ともおさらばだ!」とウキウキで環境構築していたらbundle installの段階で謎のerrorが出て余計にイライラすることになりました。

「新年早々...」と思いつつ色々調べた結果、なんと解決できたのでメモ程度に共有させていただきます。

エラーについて

※すぐにエラー内容が開けなかったため概要だけにさせてください。覚えていたら追記します。

エラーで詰まるまで以下の手順を踏みました。
・githubからrailsプロジェクトをローカルにclone
・bundle install
そして、エラーを起こしたgemは私が確認した限りでは以下のものでした。

- ffi
- sassc

解決方法

私の環境では以下の手順で解決しました。

Finder>アプリケーション>ターミナル(右クリック)>情報を見る>「Rosettaを使用して開く」にチェック

まとめ

これは他の調べものをしていた際にたまたま見つけた解決方法でした。
一応、以下に本件に関連のありそうなappleのサポートページを載せておきます。
Mac に Rosetta をインストールする必要がある場合

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

migrate出来なかった時のお話

凡ミスでmigrate出来なかった時のお話

  1. rails g modelコマンド

  2. rails db:migrateコマンド

  3. 本題のerror発生

  4. 仮設・検証

  5. 解決

上記の5段構成で進めていきます。

本題に急いでいる方は
本題のerror発生から飛んで下さい。
以降、一部補足をしながら進めていきます。

rails g modelコマンド

rails g modelコマンドでモデルを作成したとき、
db/migrate/ディレクトリにmigrationファイルが同時に生成される。

migrationファイルの中身はこんな感じ

db/migrate/20XXXXXXXXXXXX_create_複数形のモデル名.rb
class 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していた事でしょう。

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