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

Rails関連のことを調べてみた2020年05月09日
目次

[対処法]RailsでDBに反映されているmigrationファイルが消えた

# 背景
### migrationファイルが消えた経緯
– githubのコミットを取り消し
`git reset -hard HEAD^`

– コードを修正し再度コミット
`git commit -am “hoge”`

– プッシュ
`git push`

– migrationファイルが消える(ファイル全体が修正前の内容に戻った)
– github初学者のため、原因追求中です
– コメントなどで教えていただけると幸いです

# 試したこと
### 現状の把握
– migrationファイル再度作成
`rails g migration クラス名 カラム名: データ型 `

– マイグレーション実行
`rails db:migrate`
– カラム名が重複しているというエラーが出る

– データベースをリセット
`rails db:reset`

– 再度マイグレーション実行
– 上記と同じエラー

– マイグレーションを戻す
`rails db:rollback`

– データベースの状態を確認(先にやっておくべきでした)
`rails db:migrate:st

元記事を表示

Carrierwave のカラムを jbuilder でキャッシュする場合気をつけましょう

`carrierwave` のカラムを `jbuilder` でキャッシュしたら、あんまり見慣れてない `uninitialized constant ImageUploader::Uploader14420101` のようなエラーになったので、原因と対策を共有します。

## 前提
`carrierwave` を使って、`version` の定義は1つでもある場合

## 結論
1. `jbuilder` の `cache!` メソッドがキャッシュ内容として保持しているのは、普段出力される json のレスポンスではなく、`cache!` メソッドに渡すブロックにある各プロパティと値の hash になります
2. `carrierwave` のカラムをそのままキャッシュするのではなく、`json.url image.url` または `json.thumb_url image.url(:thumb)` のように明確にメソッドを呼び出しましょう

## エラーを再現する手順
### ますソースは、下記通り

“`rb
# uploader
class ImageUploader <

元記事を表示

【Rails】CRUDとHTTPメソッドとアクションとヘルパーメソッドと内容を一緒に

# 一覧表
タイトルのように、横一線で覚える方が実用的だと思い、まとめました!

Userモデルを例に

| CRUD |HTTPメソッド|アクション|URLパターン|ヘルパーメソッド|内容|
|:—:|:—:|:—:|:—:|:—:|:—:|
|Read|GET|index|/users|users_path|ユーザー一覧ページの「表示」|
|Read|GET|show|/users/(1)|user_path|ユーザーのページを「表示」|
|Read|GET|new|/users/new|new_user_path|ユーザー作成ページの「表示」|
|Create|POST|create|/users|users_path|ユーザーの『作成』|
|Create|PUT|create|/users/(1)|user_path|指定ユーザーに関わる『作成』|
|Read|GET|edit|/users/(1)/edit|edit_user_path|ユーザー編集ページの「表示」|
|Update|PATCH|update|/users/(1)|user_path|

元記事を表示

モジュールによる共通化

#モジュールとは
一連の振る舞いを一箇所にまとめたもの。
クラスと似ているが**モジュールはインスタンス (オブジェクト)を生成できない**点が異なる。
`includeメソッド`を使うことでモジュールを使い回せる。

“`***.rb
#モジュールを作成
module Chatting
def chat
“Hello”
end
end

#モジュールをDogクラスに取り込む
class Dog
include Chatting
end

#Dogクラスからpochiインスタンスを生成
#pochiをレシーバとしてChattingモジュールのchatメソッドを使用
> pochi = Dog.new
> pochi.chat
=> “Hello”
“`

元記事を表示

#Rails で JSON リクエストを受け取ると Controller でパラメータがキメラみたいにネストされるのだけど… ( rails JSON request params in controller nested – wrapped – )

wrap_parameters の設定が原因っぽい

いろんなキーワードでググっても全然見つからなかった答え

# 参考

“`rb
// post data
{“title”:”asdsad”}

// rails parameters
Parameters: {“title”=>”asdsad”, “presentation”=>{“title”=>”asdsad”}}
“`

https://stackoverflow.com/questions/27672954/rails-duplicated-the-parameters-inside-the-resource

https://guides.rubyonrails.org/action_controller_overview.html#parameters

https://api.rubyonrails.org/classes/ActionController/ParamsWrapper.html

# Original by Github issue

https://github.com/YumaInaura

元記事を表示

shoulda-matchersを使ってwhere.not条件のテストはできるのか?

### はじめに
最近shoulda-mathcersを使ってテストをすることが多くなってきました。
個人的には短くテストが書けるのですごく気に入っております。
その中で、???と思うことがあったので記事にしました。

### 本題
例えばhoge.rb(モデル)にこんな記述があったとする。

“`ruby:hoge.rb

has_many :user_companies, -> { where.not(user_id: nil)
“`

where条件のみなら下のように普通は書けると思います。

“`ruby:hoge_spec.rb

describe ‘relations’ do
it {
expect(subject).to have_many(:user_companies)
.conditions(user_id: nil)
}
end
“`

でもwhere.notはどうやってテストしたらいいのか結構悩みました。
理由としては、公式のGitHubのソースコードにも載っていなかったからなんですね…

【GitHubのソースコード】
ht

元記事を表示

Rails でクッションページを作る

# なにこれ
[体系的に学ぶ 安全なWebアプリケーションの作り方 第2版](https://www.sbcr.jp/product/4797393163/)という本の p.239 に「コラム:クッションページ」というのがある。Rails でこのクッションページを作ったらどうなるかな、と思って作成することにした。

# コードについて
– 今回のコードは [Github のレポジトリ](https://github.com/seahal/qiita) にもあります
– slim という gem を使っています

# さて、作っていきますか
とりあえず、コントローラーをつくる

“`sh
$ rails g controller confirmation_of_external_pages show
“`
ルーティングはこんなかんじ

“`ruby
Rails.application.routes.draw do
resources :confirmation_of_external_pages, only: [:show]
end
“`
コントローラーはこんな感じ

元記事を表示

Oracle VirtualBox の Ubuntu 20.04 LTS 仮想環境上に Ruby on Rails 開発環境を構築する

#はじめに
Windows で Rails アプリケーションの開発環境を構築する方法はいくつかあります。

(参考) WindowsにおけるRubyやRailsの環境構築方法をいろいろ調べてみた(2017年3月版)
[https://qiita.com/jnchito/items/9de9e515f82dc1969cc5](https://qiita.com/jnchito/items/9de9e515f82dc1969cc5)

ここでは Oracle VirtualBox の Ubuntu 20.04 LTS 仮想環境に Ruby on Rails 開発環境を構築する手順を記述します。
この方法は以下のメリットがあります。
* Linux 環境で Rails を動かすため、ネット上に情報が多い
* 環境の再構築が容易(どこかでうまくいかなくても最初からやり直せる)
* 仮想ディスクイメージを USB メモリ等で持ち運ぶことができ、複数の PC にて同じ環境が使える(ただしポータブルメディア上でそのまま動かすには、USB 接続 SSD などランダム書き込みが高速でないと実用は難しそう

元記事を表示

masterをpull出来ない。

#出来事
`master`を最新にするために、`pull`しよとしたら出来ない‥

`master`にブランチ移動する際、ターミナルに、

“`
Your branch is behind ‘origin/master’ by 23 commits, and can be fast-forwarded.
(use “git pull” to update your local branch)
sekishinya@mba gyakuten_clone_group13 % git branch
“`

のように表示されますが、**masterブランチでコミットしてはいけません**。

`commit`しても`push`できなくしていますが、履歴がおかしくなります。

#解決策

何か変更があるかどうか、状態を確認する。

“`
git status
“`

それで何かが表示されたら、一旦`stash`で一時保存する。

“`
git stash
“`

そうすれば差分がなくなり`pull`できます。ブランチを切った後に反映をしたい場合は次のコマンドでOKです。

`

元記事を表示

Rails 親子関係にないモデルを同時に更新してみよう。

どうもチャンクノです。
二週間ぐらい前にやった、親子関係にないモデルを同時に更新するやり方を書きます。
まず親モデルとしてUserがあり、子モデルとしてUserProfileとUserAddressがあります。
この子モデルであるUserProfileとUserAddressは親子関係にありません。
これを同時に更新してみましょう。

最初に自分が書いたがコードこちら

“`
必要ないところは省いて書いています。
User::UserProfilesController

def update
if @user_profile.update(user_profile_params) && @user_address.update(user_address_params)
end

private

def set_user_profile
@user_profile = current_user.user_profile
end

def set_user_address
@user_address = current_user.user_address
end

元記事を表示

Rails Tutorial メモ

# 第1章
Bitbucketへのリポジトリ追加とリポジトリへのプッシュに関して、
git remote add origin git@bitbucket.org:ユーザー名/hello_app.git
のコマンドを打つ際に、ユーザー名を間違えた⇨「作成したORIGINを消したい」
`$ git remote rm origin`

ローカル環境のプレビューが表示されなくなった場合の対処
ディレクトの移動
`$ cd hello_app`
下記コマンドを実行しプレビュー
`$ rails server -b $IP -p $PORT`

元記事を表示

【開発ログ③】初心者がデータベースの設計をしたらこうなったよ。

# 前提について
はじめまして、いりふねと申します。
現在プログラミングスクールにてアプリケーション開発の勉強をしております。32歳独身A型、さそり座です。

この記事は、スクールの課題である個人開発アプリの記録であり、私自身のアウトプットの場として設定しております。未熟な点も多いと思いますが、見かけてくださった方にどんどん指摘をしてほしいと思っております。

作成するのは、有給休暇管理ツールです。
概要説明は[こちら](https://qiita.com/iczo32/items/97ad7d4baa985b3b99ca)。

また、開発するアプリケーションについては、実際にデプロイまでは行う予定ですが、サービスとしてリリースするわけではありません。アプリケーションの性質上、高いセキュリティを求められるものであり、短期で仕上げるようなものではないと思っているからです。完成品には「注意書き」も入れようと思いますが、くれぐれも完成品を見かけても個人情報を書き込まないで下さい。

では、本題へどうぞ。

# 仕様書の続き
[前回](https://qiita.com/iczo32/item

元記事を表示

【Rails】simple_form使い方基礎

# simple_formとは?

入力フォームを簡単に作れるgemのこと。

Railsでフォームを作成するにはform_withやform_forを使えば実装できますが、simple_formというものを使えばより簡単にフォームを作成することができます。

# 使い方
お決まりのやり方ですが、Gemfileにgemを追記してbundle installし、generateコマンドを実行します。

“`
gem ‘simple_form’
“`

“`
$ bundle install
“`

“`
$ rails generate simple_form:install

※bootstrapを適用させたい場合はbootstrapオプションをつけてコマンド実行します。
$ rails generate simple_form:install –bootstrap
“`
ビューの書き方の例は以下のようになります。

“`sample.html.erb
<%= simple_form_for @user do |f| %>
<%= f.input :username

元記事を表示

[用語解説]Payjpによる決済の流れ

あるアプリ開発でPay.jpを用いた商品購入機能実装を担当した際、なかなか概念が掴みづらかったので解説

#まずそもそもPay.jpとは
・結論
開発者向けのクレジット決済代行サービス
※こちら実装して利用申請すれば本当のクレジット決済できます。

####大きく分けて2つのモードがあります。
[ライブモード]本番運用
[テストモード]動作確認←チーム開発ではこちらやりました。

決済の流れ
1、クレジットカード情報を入力フォームから入力

2、入力フォームにpay.jpのシークレットキーを埋め込むのでここでpay.jp側でカード情報照会(そのカードは存在するのか?)はしてくれます。
※emailを適当なアドレス(test@testなど)で登録すると
| AuthenticationError | PayjpのAPIによる認証に失敗してエラーが出ます。

3、カード情報に間違いなければ一旦「トークン」と呼ばれるクレジットカードidのみ持ったお買い物券が発行される(現金を一旦nimocaに変える感じ。いくら入ってるかは確認出来るがnimoca単体での金銭的価値はない)

4、品物(pro

元記事を表示

マニフェストファイルは何をどうしているのか?

#はじめに
マニフェストファイルについて学習したので、忘備録として残しておきます。

Q.マニフェストファイルは何をどうしているのか?

A.ブラウザ表示を効率的に行うために、個々のアセットを結合し、アセットパイプラインに伝えている

#アセットパイプラインのなかで役割を担う存在
アセットパイプラインとは、開発者の作成したJavaScript、CSS、画像などのアセットを効率的に扱う仕組みのことです。sprocket-railsというgemのなかのSprocketの機能で、デフォルトで有効になっています。

アセットパイプラインでは、それらのリソースをブラウザで表示するのに最適な状態へと処理します。
具体的には、高級言語のコンパイル、アセットの連結、アセットの最小化、ダイジェストの付与などが処理されます。(ダイジェストの付与が、どのような恩恵をもたらすのかはまだ経験していません、、、)

#アセットの連結されたファイルを`layouts/application.html.erb`が読み込む
アセットパイプラインの、アセットの連結、の部分を担うのがマニフェストファイルです。つまり、どのフ

元記事を表示

Rails ウィザード形式のユーザー登録機能実装 コントローラの記述(session, ハッシュ等)を紐解いてみた

####はじめに
チーム開発で、メルカリを模したアプリを開発しました。
その中で、”ウィザード形式”のユーザー登録機能を実装しました。

ウィザード形式とは
ユーザー登録ページが複数ページにわたり、全ての入力を終えてようやく登録される形式のことをいいます。


・1ページ目で名前・生年月日など基本情報を入力。ボタンを押して2ページ目へ。
・2ページ目で住所を入力。登録ボタンを押す。
・両ページに入力された情報が登録される。
といった具合です。

ウィザード形式においてポイントとなる”session”に関するコーディングを、
deviseのregistrations_controllerの
createアクション(登録1ページ目)と、
create_addressアクション(登録2ページ目)に
記述しました。

※今回、usersテーブルとship_addressesテーブルを設定しました。
 最終的に、登録1ページ目のデータが前者に、2ページ目のデータが後者に保存されます。

####実装後にやってみたこと
そのコーディングで具体的に何をしているのか?自分なりにまとめてみました。

元記事を表示

resourcesメソッドでrailsのルーティングを設定しよう

#resourcesメソッドでrailsのルーティングを設定しよう
railsで定義されている7つのアクションのルーティングを自動で作成するメソッドです。
resourcesメソッドは簡単にルーティングを設定できます。
#resourcesメソッドで定義される7つのメソッド

index:リソースの一覧を表示させる
show:リソースの詳細を表示させる
new:投稿フォームを表示させる
create:リソースを追加させる
edit:更新フォームを表示させる
update:リソースを更新させる
destroy:リソースを削除する

これらを設定することでアプリを作ることができます。
##resourcesメソッドの使い方
resourcesメソッドはルーティングを記述するroutes.rbの中で使用します。

“`routes.rb
Rails.application.routes.draw do
resources :コントローラー名
end
“`
このように記述します。

##resourcesメソッドをアクションを指定して使用する方法
onlyとexceptを使用するとアク

元記事を表示

【Rails】パスワードを設定してるのにAction mailerが動かない際の対処法

Railsの機能であるAciton mailerの機能について、設定する際にミスをしがちな部分を紹介します。

一応actionmailerを設定したけど動かない人向けです。

##config/environments/development.rbのパスワードには自身がGmailにログインする際に使用するパスワードを入力する。

セキュリティから発行する16桁の難しいパスワードではありません。あなたが日常で使用しているパスワードです。

##送信元のメールアドレスは架空のアドレスで良い。

私はexample@rails.comにしてます。

##Railsから送られてくるGmailアドレスのパスワードを変更した場合、本人だという認証確認をしなければ行けない場合がある。

上記を試して動かないという人は一度gmailをログアウトしてください。それからログインすると上記の認証確認をすることができます。

元記事を表示

[Rails] application.scssのrequire_tree .に関して

# はじめに
“rails new”を実行して得られるファイルにapp/assets/stylesheets/application.scssってありますよね。

これまで学習したきた中で

“`ruby
*= require_tree .
“`

の存在は知っていて、この記述があることで、stylesheetsディレクトリ内にある、scssファイルを読み込んでくれている、という認識でした。

それは間違いではないのですが、ある問題がおこって、あれ?ってなった

# scssファイルが読み込まれて、、ない、、??

問題が起きたのは、以下のようなコードを書いた時です。

“`ruby
# application.scss

/*
* This is a manifest file that’ll be compiled into application.css, which will include all the files
* listed below.
*
* Any CSS and SCSS file within this directory, lib/asse

元記事を表示

【Docker, BFF】Railsプロジェクト作成時にやることまとめ

[Railsプロジェクト作成時にやること全まとめ](https://qiita.com/d0ne1s/items/16b0815bb5bc0ed13eb8#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE%E8%A8%AD%E5%AE%9A)
以前こんな記事を書きました。

この時とは状況が変わり、今ではローカルにrenvやRailsをインストールしておらず、開発環境は全てDockerで作っています。

またフロントエンドはReact等で構築し、RailsはBFFとして使用することが多くなっていきそうです。これからの自分に向けて、プロジェクト作成時にやることを再度まとめて行こうと思います。以下を全て盛り込んだ、完全自分仕様です。

– Postgres
– RSpec
– VSCode Remote Development
– Heroku CLI
– Vim
– Zsh(Prezto)

## Dockerで開発環境を構築
“`zsh
$ touch Dockerfile docker-compose.y

元記事を表示

OTHERカテゴリの最新記事