Ruby関連のことを調べてみた2020年09月10日

Ruby関連のことを調べてみた2020年09月10日

[Rails]エラーStandardError: An error has occurred, all later migrations canceled: Column `外部キー名` on table `テーブル名` does not match column `id` on `テーブル名`の対処方法

## エラー内容

“`
$ rails db:migrate
“`

上記コマンドを実行すると発生するエラー。ターミナルでのエラー表記は以下の通り。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643372/a1d49d1d-e075-0f17-69c9-7e68ad077c65.png)

“`エラー文一部抜粋.
Column `user_id` on table `items` does not match column `id` on `users`, which has type `bigint(20)`. To resolve this issue, change the type of the `user_id` column on `items` to be :bigint. (For example `t.bigint :user_id`).
“`

エラー文の一部を翻訳してみると…。

“`エラー文翻訳.
テーブル `items` のカラム `user

元記事を表示

[Ransack] ransackable_scopesには気を付けろ

# 結論
`ransackable_scopes`で実行する`scope`に渡す引数が以下の値だったら
`ArgumentError wrong number of arguments (given 0, expected 1)`
が発生するから気を付けろ!!!

– `”true”`, `”TRUE”`, `”t”`, `”T”`, `1`, `”1″`
– `”false”`,`”FALSE”`,`”f”`,`”F”`,`0`,`”0″`

これらの値はそれぞれTrue, Falseに**暗黙的に変換**されるため、引数に渡せない。

## 解決策
“`config/initializers/ransack.rb
Ransack.configure do |config|
config.sanitize_custom_scope_booleans = false
end
“`
これを追記するだけで、**上述の値全てを渡せるようになります**。[^1]

## 渡せる値をカスタムしたいなら
**諦めてください。**
暗黙的に変換される値は [`Ransack::Con

元記事を表示

rails tutorial 第8章

#はじめに

独学で[rails tutorial](https://railstutorial.jp/)を進めていく過程を投稿していきます。

進めていく上でわからなかった単語、詰まったエラーなどに触れています。

個人の学習のアウトプットなので間違いなどあればご指摘ください。

初めての投稿なので読みにくいところも多々あるかと思いますがご容赦ください。

#第8章 基本的なログイン機構
##8.1.2 ログインフォーム
ログインフォームを作成時のscopeの働きについてわからなかったので調べました。

“`
form_with(url: login_path, scope: :session, local: true)
“`

参考
https://qiita.com/akilax/items/f36b13f377f7e442bc73

あまり深く考え過ぎずにパラメーターを渡す際に必要なname値のプレフィックスと考えるのが良さそうです。

ざっくりと自分なりにまとめると、Active Recodeを継承しているオブジェクトのフォームでは

“`
<%= form_with(

元記事を表示

[Rails]1対1対多の場合のdelegateとhas_many-throughの挙動の違い

下記のように1対1対多の関係のモデルがあるとします。

* UserとExamineeは1対1
* ExamineeとTestは1対多

“`ruby
class User
has_one :examinee
end

class Examinee
belongs_to :user
has_many :tests
end

class Test
belongs_to :examinee
end
“`

では、Userモデルから関連するTestモデルを取得したいときはどのように実装しますか?

様々なやり方がありますが、ActiveRecordの便利機能`delegate`を使うか、`has_many-through`を使うことが多いのではないでしょうか?
どちらもやりたいことは達成できますが、発行されるクエリが少し違うので紹介します。

# delegate

delegateを使うとメソッドを別クラスに委譲することが出来ます。
詳細はRailsガイドを参照してください。
[3.4.1 delegate](https://railsguides.jp/active_

元記事を表示

Rails 6で認証認可入り掲示板APIを構築する #5 controller, routes実装

←[Rails 6で認証認可入り掲示板APIを構築する #4 postのバリデーション、テスト実装](https://qiita.com/rf_p/items/0b2ccd908cac4bb6ecc6)

# controllerを作る

前回はmodelを作ったので、今回はcontrollerを実装していきます。

“`powershell
$ rails g controller v1/posts
“`

実行するとcontrollerとrequest specファイルが生成されます。

とりあえずcontrollerを以下まで実装します。

“`rb:app/controllers/v1/posts_controller.rb
# frozen_string_literal: true

module V1
#
# post controller
#
class PostsController < ApplicationController before_action :set_post, only: %i[show update destroy]

元記事を表示

Ruby/Rust 連携 (5) Rutie で数値計算② ベジエ

連記事目次

* [Ruby/Rust 連携 (1) 目的](https://qiita.com/scivola/items/1f51a294c86a70aa78aa)
* [Ruby/Rust 連携 (2) 手段](https://qiita.com/scivola/items/d6de19cd985a5cd27f7e)
* [Ruby/Rust 連携 (3) FFI で数値計算](https://qiita.com/scivola/items/5ab8c6ba0b81a63d976e)
* [Ruby/Rust 連携 (4) Rutie で数値計算①](https://qiita.com/scivola/items/ce00cd5f37a9d01754ea)
* Ruby/Rust 連携 (5) Rutie で数値計算② ベジエ

# はじめに

前回は Ruby と Rust をつなぐ Rutie というものを使って,Rust の簡単な数値計算関数を Ruby から呼び出してみた。
速度面では,同じ計算を Ruby でやらせたのよりずっと遅かった。これは Ruby から R

元記事を表示

rails チュートリアル

1.3.4からスタート

元記事を表示

rails newする際のオプションとrails newした後に行う設定

個人的に「`rails new`をする際によく使うな」と感じるオプションと、新規プロジェクトを作成したときによく行う設定を備忘録を兼ねてまとめます。

# rails newをする際のオプション
まずは`rails new`をする際によく付けるオプションについてです。
一つ一つのオプションについては後述します。

“`
rails _6.0.3.2_ new appname –database=mysql –skip-test
“`

### railsのバージョン指定

“`
rails _6.0.3.2_ new
“`
こうするとrailsのバージョンを指定することができます。
`_6.0.3.2_`の部分はその都度値を変えてください。

### 使用するデータベースの指定
“`
–database=mysql
“`
このようにDBを指定しないと、デフォルトのDBは`sqlite`というものになります。
今回は`mysql`を使用する設定です。

### Minitestを生成しない
“`
–skip-test
“`
デフォルトでプロジェクトを生成すると、M

元記事を表示

二重ハッシュより値を取り出し、ゲッターにより出力致します。

“`ruby
class Fruits

def initialize(name, color, variety) #仮引数(第一引数, 第二引数, 第三引数) #initializeメソッドは新たな呼び出しは不要です。
@name = name #インスタンス変数を定義
@color = color
@variety = variety
end

def name #ゲッター(ゲッターメソッド名は、クラス外で出力する際に用いますので、重要です。)
@name #インスタンスの値を取得している
end

def color #同じくゲッター
@color
end

def variety
@variety
end

end

class InfoFruits #呼び出しが必要です。

def initialize(fruits) #インスタンス変数の定義
@fruits = fruits
end

def fruits #ゲッター
@fruits #インスタンス変数の値

元記事を表示

【Rails】副問い合わせをする場合の書き方

#副問い合わせ(入れ子)でSQLを流したい
重複したデータを確認する例で確かめる。
##副問い合わせの形を作る
**usersテーブル**

| id | name | address |
|:-:|:-:|:-:|
| 1 | sasaki | tokyo |
| 2 | itou | fukuoka |
| 3 | fujita | nagasaki |
| 4 | sasaki | osaka |
| 5 | itou | nagano |

例えば上のようなテーブルがあったとする。
nameが重複するレコードを取り出し、addressを確認したい。

“`SQL:sql1:nameが重複しているものを選択
SELECT name FROM users GROUP BY name HAVING count(name) > 1
“`

**結果**

| name |
|:-:|
| itou |
| sasaki |

これだとそれぞれのaddressがわからないため、この結果を踏まえて次のようにSQLを実行する。

“`SQL:sql2:重複結果を

元記事を表示

記事を複数使うのは要注意

#参考記事の数
 Qiitaには魅力的な記事が数多くあるため、多くの記事を参考にしがちである。しかし、記事によって書き方は様々であるため、その内容を理解しないまま複数の記事を参考にすると、エラーの原因となりがちである。
そのため、一つの機能を実装する際には、一つの記事のみを参考にすべきである。

#複数の記事を参照すると・・・
たとえば、DM機能を作りたいとして
https://qiita.com/tenitiumai/items/3d9466d7a24197f690bb 
を参考にしたとしよう。

“`model/message.rb
class Message < ApplicationRecord belongs_to :user belongs_to :room end ``` 上記の記事のuser.rbにはこのようなコードが記述されていたとしよう。 しかし、別の記事も参考にしたために、実際には ```model/message.rb class User < ApplicationRecord validate :messages, presence: tr

元記事を表示

ABC177 – EをRubyで解く

# はじめに
[AtCoder Beginner Contest 177](https://atcoder.jp/contests/abc177)の[E問題](https://atcoder.jp/contests/abc177/tasks/abc177_e)について細かく解説を書く機会があり、思いのほか出来が良かったので記事としてまとめようと思う。

# 考察
[問題](https://atcoder.jp/contests/abc177/tasks/abc177_e)より、焦点を以下の順番で三つに分割できる。

1. 『全ての1 ≦ i < j ≦ N について、GCD(A_i, A_j) = 1』が成り立つ 2. 『GCD(A_1 …… A_N) = 1』が成り立つ 3. いずれも成り立たない 次より、これら三つをより細かく見ていく。 ## 1.『全ての1 ≦ i < j ≦ N について、GCD(A_i, A_j) = 1』が成り立つ 全ての場合を愚直に求める。 ```ruby N.times do |i| N.times do |j| if A[i].gc

元記事を表示

Rubyアルゴリズム(inject,メソッド定義)

#はじめに
Rubyアルゴリズムを学習する際に作成したコードを解説します。
#学んだ事
次の技術に挑戦しました。

* injectメソッド
* メソッド定義

#挑戦したこと
10個ずつ数字を並べた二つの配列を使用します。
それぞれの配列の、1番目・1番目から2番目の和・3番目までの和…を比較し、
どちらが大きいか表示するコードを作成します。

#内容

まずはなんでもいいので、配列を二つ用意します。

“`ruby
a = [1,2,3,4,5,6,7,8,9,10]
b = [10,2,2,2,2,2,2,2,2,2]
“`

次に
配列の和を求めるメソッドを作ります。
色々方法はありますが、ここではinjectメソッドを使用します。

“`ruby
def sum(array,n)
sum = array[0,n].inject(:+)
return sum
end
“`

`array[0,n].inject(:+)`の部分では、引数として代入した配列の1番目からn+1番目の和を計算します。

最後に、上記の処理を配列の全ての要素に対して実行し、その度に大小を

元記事を表示

Ractorで複数のオブジェクトを渡せるようにしてみた

## 結論

Ractorで以下のコードを動くようにしてみました。

“`ruby
r = Ractor.new do
v1, v2 = Ractor.recv
puts v1
puts v2
puts v1.class
puts v2.class
end

r.send(1, 2)

r.take
# => 1
# => 2
# => Integer
# => Integer
“`

## Ractorって?

Ruby3で導入される並行・並列機能を提供するしくみです。
元々はGuildという名前で数年前から議論されてきたものです。

詳しい話は下記の動画を参照して頂ければと思います。

[[JA] Ractor report / Koichi Sasada @ko1](https://www.youtube.com/watch?v=40t8EPpnujg)

## Ractorへオブジェクトを渡す

`send`メソッドを使ってRactorへとオブジェクトを渡すことができます。

“`ruby
r = Ractor.new do

元記事を表示

DockerでRuby on rails6のアプリケーションを環境構築したメモ

##目標
– Ruby on Rails6 のアプリケーションをDockerで新規にアプリを立ち上げたい
– DBはMySQL

##前提知識
– Docker on mac
– Rails tutorial完了などRuby on rails に関する基礎知識

##1.作業ディレクトを作成し、移動する
“`
MacBook-Air ~ % mkdir アプリ名
MacBook-Air ~ % cd アプリ名
MacBook-Air アプリ名 %
“`

##2.Dockerfileを定義する
“`:Dockerfile
FROM ruby:2.6.3
RUN apt-get update -qq && apt-get install -y nodejs

# yarnパッケージ管理ツールをインストール
# https://classic.yarnpkg.com/en/docs/install/#debian-stable
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add –
RUN echo

元記事を表示

【Ruby on Rails】フォロー機能実装:双方向

# 目標
![follow.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700999/8d494479-610a-7244-5079-1fd7a0a2aac8.gif)

# 開発環境
ruby 2.5.7
Rails 5.2.4.3
OS: macOS Catalina

# 前提
※ ▶◯◯ を選択すると、説明等が出てきますので、
  よくわからない場合の参考にしていただければと思います。

– [deviseでログイン環境構築](https://qiita.com/japwork/items/275110b810965fbdf72f)

※[一方向のブックマーク(お気に入り登録、いいね)機能はこちら](https://qiita.com/japwork/items/3ca48e7c5fa1053b910b)

# 流れ

1 modelを作成
2 modelを修正 <-- ここが一番むずかしいです 3 controllerを作成 4 routingを修正 5 viewを作成 # modelの作

元記事を表示

deviseを使ったユーザー情報の変更をする場合パスワードが保存されない時のedit画面での設定

##deviseを使ったユーザー登録情報の編集をする場合、edit→updateを行うときビュー画面のエラーメッセージがCurrent password can’t be blankと表示され、編集画面が保存されない場合の解決方法。

ruby ‘2.6.5’
rails ’6.0.0
devise 4.7.2

###2つのdeviseをもつアカウントがあり、ユーザー登録情報を編集し、保存をしたい場合の設定の流れをまとめます。

#####①ルーティングの確認/rails routes でuserのregistrations/editのパスを確認します。

“`

edit_user_registration GET /users/edit(.:format) users/registrations#edit
“`

edit_user_registration_path と確認が取れました。これをlink_toでパスを作成します。

#####②contro

元記事を表示

Rubocopの警告(error)を無視する方法

“`rb
rescue => e # rubocop:disable Style/RescueStandardError
“`

こうやるともっと親切

“`rb
rescue => e # rubocop:disable Style/RescueStandardError why: — rescue all to report Honeybadger
“`

元記事を表示

Ruby初心者が2ヶ月で電車の時刻を通知してくれるLINE BOTを作って公開した話

# はじめに
「アヤセ教えて君」というLINE Botを開発しました。
まだまだ未完成な部分は多いですが、メインとなる機能の開発を終えたのでGitHub,Qiitaで公開することにしました。
この記事では、機能や技術的な解説をしていきます。
友達追加はこちら
友だち追加
# GitHubリポジトリ
https://github.com/Aseiide/ayase_bot

# アヤセ教えて君とは
![demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326789/8acfa189-82a9-3938-4185-a90832c3d2ef.gif)

– 東京メトロ千代田線<下り方面>で活用できます
– 千代田線において【現在いる駅】を

元記事を表示

CircleCI + Capistrano + AWS(EC2) + Railsで自動デプロイしてみた

# はじめに
先日、Capistranoを使って自作のポートフォリオをAWSにデプロイしたので、CircleCIと組み合わせて自動デプロイしてみました。

筆者はプログラミング学習を始めて4ヶ月ぐらいですが、一週間ほどで実装できました。

**ポートフォリオにCircleCI/CDを組み込んでみたい!**という方の参考になれば嬉しいです。

ご指摘等あれば、コメントいただければ幸いです。

# 前提
– Railsアプリ作成済
– CIrcleCIによる自動テストを導入済
– Capistranoを使ってAWSにデプロイ済

CircleCIとCapistranoに関しては別の記事でまとめています。

[CircleCIでSystemSpec(RSpec)とRubocopを走らせる](https://qiita.com/YK0214/items/bbed63ea7ca5367dae2f))
[Capistrano + AWS(EC2) + Rails で簡単デプロイ](https://qiita.com/YK0214/items/355ba23f7bf7758e232d)

# 手順

元記事を表示

OTHERカテゴリの最新記事