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

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

rails データの保存の書き方 (書籍 vs 実務 )

書籍などは

“`ruby
def create
@post = Post.new(post_params)
if @post.save
flash[:success] = “保存に成功”
redirect_to posts_path
else
flash[:error] = “保存に失敗”
redirect_to new_post_path
end
end
“`

実務では、調査の為の例外のログの吐き出しと、slcakなどの通知ツールする所までがセットで、保存機能が完結する

“`ruby
def create
@post = Post.new(post_params)
@post.save! # 例外を発生させる
flash[:success] = “保存に成功”
redirect_to posts_path

rescue StandardError => e
logger.fatal “#{e.class}: #{e.message}”
slack_notify(e) # sl

元記事を表示

検索機能の実装(form_tag・ransack)

#検索機能の実装
form_tagとransackをそれぞれ用いた2種類の検索機能の実装を行いました。
特にこだわりがなければransackを用いたほうが簡単に実装できると感じました。

##form_tagを用いた検索機能の実装

タスク一覧が表示されるtasks#indexページに、検索フォームを実装しました。
検索フォームに入力されたキーワードがデーターベースにあるタスク名と部分一致した場合、そのタスクを表示されるようにしました。
(html.slim, bootstrapを用いました。)

“`ruby:views/tasks/index.html.slim
h1 タスク一覧

= link_to ‘新規登録’, new_task_path, class: ‘btn btn-primary’

= form_with :method => “get”, local: true do |f|
.form-group
= f.submit “Search”, :name => nil ,class: “btn btn-outline-primary”
= f.

元記事を表示

入力不可にしたセレクト項目をRailsに送信するTips

# 環境
Vagrant + Ubuntu 16.04.5 LTS
Rails 5.2.4.2
jQuery
slim

# やった事
入力フィールドを入力不可にするには、jQueryでこのように記述する事になります。しかし、disabledにすれば、ビューからコントローラに送信されない事が判明。つまり、Railsのコントローラ側で該当のカラムが更新されない事になります。なんと!

“`tasks_index.js
$(“#task_todofuken”).prop(‘disabled’, false);
“`

そこで、次のやり方で、readonlyにすれば、サーバーへ送信されるようになります。

“`tasks_index.js
$(“#task_todofuken”).attr(‘readonly’, true);
“`

text_fieldであればこのやり方でいいのだが、今回はselectフィールドを利用しており、そもそも、selectフィールドにはreadonlyの属性を持っていない。
*(ぼやき:よくよく考えれば、selectフィールドでreadonlyにする意

元記事を表示

Rails Tutorial 6`require’: no implicit conversion of String into Integer (TypeError)

そもそもbootsnapとは?
https://qiita.com/Daniel_Nakano/items/aadeaa7ae4e227b73878

### 手取り早く、解決したい方へ

“`console.
gem list bootsnap
// bootsnap (1.4.6, 1.4.4)
“`
と、バージョン差異が出ていたら、

“`console.
gem uninstall bootsnap –version {指定したい方}
“`
と、必要のないバージョンを削除して終わりです。

### そもそも
ローカルで開発する際、Gemfileをいじると思います。
私の場合、

“`console.
user-no-MacBook-Pro:user$ bundle update
user-no-MacBook-Pro:user$ bundle install –without production

Bundle complete! 31 Gemfile dependencies, 108 gems now installed.
Gems in the g

元記事を表示

【Rails】has_manyの数を制限するvalidate

例えば、Userが持てるPostの数を制限したいときは、Post側にvalidateを設定します。

“`ruby:user.rb
class User < ActiveRecord::Base has_many :posts, dependent: :destroy end ``` ```ruby:post.rb class Post < ActiveRecord::Base MAX_POSTS_COUNT = 5 belongs_to :user validate :posts_count_must_be_within_limit private def posts_count_must_be_within_limit errors.add(:base, "posts count limit: #{MAX_POSTS_COUNT}") if user.posts.count >= MAX_POSTS_COUNT
end
end
“`

これで、6個目のPostを作成しようとするとエラーになります。

ちなみに、Use

元記事を表示

Railsチュートリアル学習記録(第1章)

※チュートリアル2周目。開発環境はAtomを使用しています。
※頭の整理と備忘を兼ねて、学習内容を記録しています。
※表現の厳密さや精緻さよりも、直感的に理解しやすいよう記録しています。

・第1章でやりたいこと
⇨開発環境(アプリを作っている場所)で、「Hello World」という文章を表示させるプログラムを作成し、本番環境(アプリを公開する場所)に公開する。

・最初にRailsをダウンロードする。「-v 5.1.6」でバージョンを指定している。バージョン毎に機能が異なったりするので気をつける。

“`ruby:filename.rb
$ gem install rails -v 5.1.6
“`

・アプリ開発に必要なファイル等を一括ダウンロード(ここでもバージョン指定)

“`ruby:filename.rb
$ rails _5.1.6_ new hello_app
“`

・実装したい機能に応じてgemfileを修正し、必要なgemをインストール。
※gem:ある機能のソースコードの塊。機能を実装するたびに一からコードを書くのは大変なので、よく使う機能のコード

元記事を表示

2020年最新【EC2】 postgresql9.6、10、11をインストールする方法

“`
$ yum update
$ yum install postgresql

noを選択する。すると下記の文字が現れる。

postgresql is available in Amazon Linux Extra topics “postgresql9.6” and “postgresql10” and “postgresql11”

To use, run
# sudo amazon-linux-extras install :topic:

Learn more at
https://aws.amazon.com/amazon-linux-2/faqs/#Amazon_Linux_Extras

で、下記を入力すればインストールできる。
$ sudo amazon-linux-extras install postgresql9.6

$ yum install postgresql-server

“`

元記事を表示

RailsにBULMAでビューを作成するまでの手順

どうも!!
Railsで、オリジナルアプリ開発を始めた、プログラミング学習歴3ヶ月の初心者です。

##BULMAを導入するまでの経緯

CSSフレームワークのBULMAをRailsで使いたい!!!

「今のところJSを使わないので、BootstrapではなくてBULMAを使いたいな。」と思い立ち、
ビューで使用するまでの手順を模索していました。

BULMAの概要は以下を参照ください。
[BULMA](https://bulma.io/)

##具体的な手順

###gemをGemfileに記載する

“`ruby:Gemfile
gem “bulma-rails”
“`

###bundle install

“`ruby:ターミナル

$ bundle install

“`

###application.scssでimport

“`ruby:application.scss
@import “bluma”;
“`
app/assets/stylesheets/application.scss(application.cssから変更してます。)
にBULMA

元記事を表示

ActiveRecordでnew => build => save! するとどうなる

関連付けのあるモデルにおいて、親レコードをnew => 子レコードをbuild => 親レコードをsave! したときの挙動が複雑な気がしたのでメモ。

(理解力が不足しているだけかもしれない。)

検証環境: ActiveRecord 6.0.2.1

# 結論を言葉で

– has_oneでは親レコードと子レコードのvalidityは独立している。
– has_manyでは子レコードが1つでもinvalidなら親レコードもinvalidになる。

親レコードをsave!したとき、

– 親レコードがinvalidならraiseする
– 親レコードも子レコードもvalidな場合、insertがtransactionで囲まれて実行される
– 親レコードがvalidで子レコードがinvalidな場合(上記の性質によりhas_oneでのみありうる)、親レコードのinsert処理のみが実行される

# 実験

サンプルは以下。

migrations:

“`ruby
class CreateTables < ActiveRecord::Migration[6.0] def chang

元記事を表示

【FactoryBot】外部参照キーのカラムデータの作成方法

# 【FactoryBot】外部参照キーのカラムデータの作成方法

FactoryBotで外部参照キーとなるカラムデータを作成する方法を調べたので内容をまとめます.
例えばPostモデルでファクトリデータを作成する際に一緒に投稿者となるUserのファクトリデータを作成するような状況です。

## 目次
1. [状況](#状況)
* [動作環境](#動作環境)
* [手順](#手順)
* [結果](#結果)
* [当初つまづいた点](#当初つまづいた点)
* [おわりに](#おわりに)

## 状況

Messageモデルのテストを行うためにConversationモデルとUserモデルのデータが必要です。
下記が今回のER図です。

Messageモデルは`belongs_to :user, belongs_to :conversation`というアソシエーションを持ちます。

すなわちMessageモデルのFactoryBotを実行した際にConversationモデルとUserモデルのデータを生成する必要があります。

![image.png](https://qiita-ima

元記事を表示

Rails モデル作成時 ファイルアップロードエラー

## 問題

“`
Sample.create({name: “hoge”, icon: File::open(‘db/dummy-001.png’)})

rails aborted!
Errno::EXDEV: Invalid cross-device link @ rb_file_s_link – (db/dummy-001.png, /tmp/7408f7ac8f26bae8efad1f94360df7e420200514-12545-30ex00.png)
/work/vendor/bundle/ruby/2.4.0/gems/paperclip-6.1.0/lib/paperclip/io_adapters/abstract_adapter.rb:62:in `link_or_copy_file’
/work/vendor/bundle/ruby/2.4.0/gems/paperclip-6.1.0/lib/paperclip/io_adapters/abstract_adapter.rb:55:in `copy_to_tempfile’
/work/vendor/bun

元記事を表示

[Ruby]GraphQLで認証を実装する

# はじめに
最近、graphql-rubyを勉強中です。認証周りを実装してみたので忘備録です。
ただ、この方法が正解かどうかは模索中です。

# やりたいこと
あるmutationなりqueryはログインユーザしか発行できないけど、ユーザに関係ないquery等はログインしてなくても発行できるようにしたい。でも全てのqueryとかでログインしてるかどうかのコードを追加するのはめんどくさい。

# まずは通常の認証
graphql_controller.rbのexcute内でuserの認証を行い、contextにcurrent_userを保持させます。

“`graphql_controller.rb
def excute
current_user = User.auth_user(params)
context: { current_user: current_user }
# その後の処理↓

end
“`

上の例だと、auth_userメソッドで認証して、userオブジェクトをもらっています。
contextに引き渡すと、resolver内等でcontext[:

元記事を表示

【簡潔】Brakeman導入方法-Rails-

###Brakeman導入方法
####Brakemanとは
Brakemanとはアプリケーションを開発した際にセキュリティ検査ができるgemの一つです。
Railsでは元からセキュリティについては比較的維持できるものですが、私が開発した際に補助的にこのようなツールを使ってみました。ちなみにBrakemanは静的なツールです。

####導入方法

作成中のプロジェクトの`Gemfile`内の`group :development do`と`end`の間に`gem ‘brakeman’, require: false`を追記します。

“`Gemfile

group :development do
gem ‘brakeman’, require: false
end
“`

次にターミナルの作成中アプリのディレクトリで`brakeman`と叩けばBrakemanでのセキュリティチェックが始まります。

“`ターミナル
% brakeman
“`
出力はこんな感じです。

“`ターミナル
== Brakeman Report ==

Application Path:

元記事を表示

【rails】active_hash セレクトボックス作り方

# 目的
active_hashを使うと
セレクトボックスの選択肢を作る上で…
DBを使わずに、使うことができる。
![e45d5968e89b3a236c6a55a3f25b2777.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628336/873419f5-fab3-9ce1-e647-aa5bb5ac1569.gif)

# 準備

1.Gemfileに以下を記述する。

“`
gem ‘active_hash’
“`

下記と合わせてサーバの再起動も行う

“`
$ bundle install
“`

準備はこれだけ

# 実装例
itemsテーブルにregion_idカラムを用意して、itemの登録の時にregion(発送元の地域)をアクティブハッシュから選択する。(下のgifのようなイメージ)
![e45d5968e89b3a236c6a55a3f25b2777.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws

元記事を表示

railsでsidekiq-schedulerを動かす

[公式](https://github.com/moove-it/sidekiq-scheduler)のUsageはrailsで動かす前提じゃなかったので、railsで動かす場合のUsage的な何か。

* 0. ばーじょん

“`ruby:Gemfile.lock
rails (6.0.1)
sidekiq (6.0.7)
sidekiq-scheduler (3.0.1)
“`
* 1. Gemfile書く

“`ruby:Gemfile
gem ‘sidekiq-scheduler’
gem ‘sinatra’, require: false # ダッシュボードいらない場合はいらない
“`
* 2. 初期設定を書く

[herokuで動かす場合は環境変数に設定しておくこともできる](https://github.com/mperham/sidekiq/wiki/Using-Redis#using-an-env-variable)ので、その場合はなくても構わない、多分。

“`ruby:config/initializers/sidekiq.rb

元記事を表示

【Rails】後からカラムを追加して外部キーを張る際に、add_referenceを使う場合の注意点。

##始めに
忘れがちになるため、備忘録。

##環境
Ruby 2.6.5
Rails 5.2.4.2

##アソシエーション対象
投稿用のpostsテーブルと、ユーザーのusersテーブルを関連付け。
postsテーブルに外部キー制約を張ったuser_idカラムを追加する

##カラム追加用のマイグレーションを作成
1.マイグレーション作成

“`
$ rails g migration AddUserIdToPosts
“`

2.マイグレーションファイルへの記述。__foreign_key: trueを忘れずに記述すること。__

“`ruby:db/migrate/[timestamps]_add_user_id_to_posts.rb
class AddUserIdToPosts < ActiveRecord::Migration[5.2] def change add_reference :posts, :user, foreign_key: true end end ``` ※上手く外部キー制約が追加されない記述。 ```ruby:db/mig

元記事を表示

サジェスト機能を実装

#サジェスト機能を実装
機能を追加したので学んだことをoutputしておく。
理解が深まればもう少しわかりやすく改善していく予定。

##実装内容
以下の写真のように文字を入力すると候補が表示されるようにしたい。
![スクリーンショット 2020-05-14 15.06.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590181/19eef39b-f757-a76e-2c79-0b667afa599d.png)

まず
`gem ‘jquery-ui-rails’`をGemfileに記載し、
`bundle install`を実行
jQuery UIは、jQueryを拡張するライブラリ(プラグイン)の一種
これにより「autocomplete」が使えるようになり、候補がリストで表示される。

早速、`search.rb`を作成し、以下のように配置する。(今回は新たに作成したが既存のものに書いても良い。)
![スクリーンショット 2020-05-14 15.11.33.png](https://qi

元記事を表示

Railsプロジェクトの *_spec.rb の中で xmpfilter を使う方法

### 要点

1. `rspec/autorun` を読み込むことで rspec コマンドで実行したのと同じ状況にする
1. `require “rails_helper”` などが失敗しないように `-I spec` を指定
1. カレントディレクトリを Rails.root に固定するため `–cd` に .git のあるディレクトリを指定

### 例

“`elisp
(defun rubyxmp ()
(interactive)
(let ((s “xmpfilter –dev –fork –no-warnings –poetry”)
(rspec-p (string-match “_spec” (buffer-file-name)))
(git-root (locate-dominating-file default-directory “.git”))
xmpfilter-command-name)
(when rspec-p
(setq s (concat s ” -r rspec

元記事を表示

[Rails]form_for/form_withの書き方(haml含む)

# はじめに
自分が初めてform_with/form_forの文法を学んだ時に「???」となったので、
初学者にも分かるような説明記載と自分の備忘録として記載します。

まず、はじめに「form_for」はRails5.1で非推奨となっており、将来的にform_withに置き換えられる予定です。
「Rails5.1以上」と「form_with」の使用が推奨とされております。(2020/5/14現在)

# **「form_for」と「form_with」**
## 1.form_for
– Railsでフォームタグを簡単に作成するためのメソッド
– モデルに基づくformに使用される

form_forは以下のように書きます。

“`ruby
<%= form_for モデル do |form| %>
<%# フォームの部品 %>
<% end %>
“`
具体的なコードで書くと、
※モデルはUserとする

“`ruby
<%= form_for @user do |form| %>
<%= form.text_field :email %>
<%= form.

元記事を表示

【jQuery】【rails】使えない!? 動かない

# 解消したいこと
jQueryが上手く動かない
しかしリロードをすれば、動くようになる
なぜ??

#原因
結論、Turbolinksが邪魔している
デフォルトgemであるturbolinks(ajaxとajaxとhistoryAPIを使ってページ遷移しやすくするもの)が動作しているため、そもそも$(document).ready()が動かない
つまりページが変わっているように見えて、上記のことが起きておりjqueryは起動しない。

# Turbolinksとは
ページ上のリンクをクリックした時に、ページ全体をリロードさせるのではなく、bodyタグの中身とheadの中のtitleを同一ページ上で書き換える方法。
.jsとか.cssとか処理し直さないので、ページの読み込みがかなり早くなる。

# 使い方

gemfileに以下を記述

“`
gem ‘jquery-turbolinks’
“`

bundel install と サーバ再起動を行う

# 解消例

該当のjqueryをこの記述に入れることで解消された。

“`.js
$(document).on(‘turbol

元記事を表示

OTHERカテゴリの最新記事