Rails関連のことを調べてみた2019年12月24日

Rails関連のことを調べてみた2019年12月24日

【Rails】アソシエーションを独自メソッドで定義した時の「source:」の記述注意点

# この記事の対象者
– Railsでアプリケーションを作り始めたばかりの人
– アソシエーションを学んだばかりのプログラミング初心者

# 伝えたいこと
中間テーブルの外部キーを独自カラムで設定したい時、「source: ○○」を中間テーブルの「belongs_to: ○○」と一致させる必要がある。

# テーブル設計

スクリーンショット 2019-12-24 11.09.39.png

多対多のテーブルを繋ぐ中間テーブルの外部キーを独自カラムに設定したい時ありますよね。

今回は、UserテーブルのID(主キー)をManagementテーブル(中間テーブル)の「participant_id」という独自カラムの外部キーで設定するパターンで考えていきます。(通常は「user_id」で定義する)

※UserとE

元記事を表示

新卒が入社半年で社内サービスをリリースしてエンジニア楽しいってなったお話

[Classi Advent Calendar](https://qiita.com/advent-calendar/2019/classi) 22日目は、新卒でClassiに配属され、エンジニアをしている@ruru8がお送りします。

今回お話するのはClassiの社内研修のお話。からのその過程で作成したRailsアプリケーションのお話です。
作成したアプリケーションは『Classi BookBook(クラッシーブックブック)』と称し、社内で多くの人に利用してもらえるサービスとなりました。
なんの経験もスキルもない新卒エンジニアがいったいどのようにして社内で親しまれるサービスを作ったのか、自分の中での振り返りの意味も込めてお話したいと思います。

## Classi BookBookって?
社内での書籍購入を管理するアプリです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533070/21cb1d4c-4b40-024d-e640-10af65a20d81.png)
書籍一覧で登録

元記事を表示

Railsにマークダウン記法を取り入れる方法

## 結論
1,2,3を導入すればいい

**1.** gem ‘redcarpet’

**2.**

“`rb
module MarkdownHelper
def markdown(text)
options = {
filter_html: true,
hard_wrap: true,
space_after_headers: true,
with_toc_data: true
}

extensions = {
autolink: true,
no_intra_emphasis: true,
fenced_code_blocks: true,
tables: true
}

renderer = Redcarpet::Render::HTML.new(options)
markdown = Redcarpet::Markdown.new(renderer, exte

元記事を表示

Rails6 each文にてeachがメソッドとして扱われて困った話

# 目的

– each文を使用してカラム内容を順に出力したい時にeachがメソッドとして扱われてしまって困ったときの解決法をまとめる

# 結論

– each文で繰り返し処理の対象の変数に格納されている値を配列状態で格納する。

# エラーの内容とエラー時のコード

– 当該ページは`@posts.content`に格納されている内容をeach文で次々渡し、表示する処理がある。
– 当該ページへアクセスしたところ下記のエラーが発生した。

“`
undefined method `each’ for #
“`

– エラーに関係するルーティングファイルの内容を記載する。

“`rb
get “posts/index/:id” => “posts#index”
“`

– エラーに関係するpostsコントローラファイルの内容を記載する。

“`rb
def index
@posts = Post.find_by(id: params[:id])

元記事を表示

Webサイト編 – 5日ぐらいでいい感じのWebサイトとポートフォリオを作る

## 1 ~ 2日目 – (Webサイト) デザインの選定と作成

– 1) サイトの名前を決める & ドメイン取得
– 2) ディレクトリマップの作成
– 3) ペーパープロトの作成
– 4) CSSフレームワークの選択
– 5) MySQLWorkBenchで簡易的なデータベース設計
– 6) Webデザインの作成(AdobeXD)

### (1) サイトの名前を決める & ドメイン取得

ドメイン取得を視野に入れたサイトの名前は決めは結構難しいです!

とりあえず助けてくれそうなWebサイト達を使います。

– [nameboy (名前のアイデアを助けてくれる)](https://www.nameboy.com/)
– [Namech_k(色んなサイトで使われてるか調べてくれる)](https://namechk.com/)

今回はストレージに関するWebサイトなので**Storage**は入れたいです。

一つの単語だけだと99%既に使われていたり、高額で売りつけられるのでもう一つぐらい単語を付け足したいのでGB(ギガバイト)をsurffixに付けた**StorageG

元記事を表示

5日ぐらいでいい感じのWebサイトとポートフォリオを作る

# 5日ぐらいでいい感じのWebサイトとポートフォリオを作る

長文を書きましたが、結局は「記事を作って公開して最終的にどこからか案件もらえないかな〜チラチラ」という一行を希薄化しただけです。
タイトルはもしかしたら「Railsでプロトタイプを素早く作る」とかでも良かったかもしれないです。
ちなみに作ったWebサイトが跳ねる確率は限りなく0です。

## 何を作ったのか

### StorageGB ([https://storagegb.space](https://storagegb.space))
オンラインストレージの比較サイト

### ポートフォリオ ([https://daicon.xyz](https://daicon.xyz))
自分が作ったWebサイトを実績として載せたり、仕事の受注等に使う(予定)

## なぜ作ったのか

理由は二つあります。

>
> 国内にオンラインストレージを体系的にまとめたサイトがなかったため(記事はちらほら見るけども)。どうせなら自分がついでに作っておこう。と言う軽い気持ち
>

もう一つは

>
> RubyとRailsを学んでいる初

元記事を表示

rails/gem “ancestry”を使って多階層構造をつくる

## “ancestry”・・・ 親・子・孫みたいな多階層構造のテーブルを作れるgem。

例)食べログのラーメンカテゴリ

| 親  | 子  | 孫      |
|:—————–|——————:|:——————:|
| 親:ラーメン  | 子1:ラーメン | NULL |
| | 子2:汁なしラーメン | 子2の孫: 油そば |
| | | 子2の孫:台湾まぜそば |
| | | 子2の孫: 汁なし担々麺 |
| | 子3:つけ麺 | NULL |

ラーメンは3つ子要素がある。
この場合、汁なしラーメンは孫が3つある。
ラーメンとつけ麺は子のみ。

つまり、親 → 子2:”汁な

元記事を表示

form_tag,form_withと空のnewアクション

#はじめに
今スクールでpictweetという、写真とツイートを一緒に投稿できる、簡単な練習用のwebサービスをつくっているのですが、ふと気になったことがあったので記事にしてみました。
#form_tag,form_withとnewアクション
MVCモデル学習し、ツイートが投稿されたときの流れも理解していたつもりでした。
投稿されたデータがデータベースに保存されるためにはnewアクションでインスタンス変数を定義しなければいけないと思っていたのですが、、、
サンプルコードを見ると

“`ruby:qiita.rb
def new
end
“`
え???newアクションの中身なにもないやん!(◎_◎;)
でもよく似たwebサービスのサンプルコードではpostsコントローラに「@post = Post.new」としっかりインスタンス変数が定義されていました。
何が違うの?
と思って数時間かけて調べた結果,HTMLでform_tagを使用していた場合は、newアクションでインスタンス変数は定義しなくていいみたいです。
逆にform_withを使用する場合は@モデル名で定義しな

元記事を表示

Rails の scope 便利手帳

Ruby on Rails で、使いやすいScopeをまとめました。
Model の設計によって差異があるものの、視点は使えるのでは?と思います。

# Scopeとは
Model に scope を記載することで、Controllerなどから、複雑なWhere条件を書かずにデータを取りだせるようになります。

“`ruby:app/model/article.rb
class Article < ApplicationRecord scope :newer, ->{order(“updated_at DESC”) }
end
“`

これによって、Controllerなどで

“`ruby:app/controllers/articles_controller.rb
@articles = Article.newer
“`
で、更新日が新しい順に取得することができます。

“`ruby:app/controllers/article.rb
@articles = Article.newer.limit(5)
“`
とすると、更新日が新しい順に5件を取得できます。

元記事を表示

rails6.1から追加される予定のActionView::Componentを4ステップで入門

# rails6.1から追加される予定のActionView::Componentを4ステップで入門

## 準備

事前にサンプルrailsアプリケーションを作成しておきます。

“`
$ rails new try_action_view_compponent
$ cd try_action_view_compponent
$ rails g scaffold user
$ rails db:create
$ rails db:migrate
“`

## “actionview-component”の基本的な使い方

### 1. Gemfileにgem “actionview-component”を追加

“`diff:Gemfile
+ gem “actionview-component”
“`

“`
bundle install
“`

### 2. config/application.rbでモジュールをrequireする

“`diff:config/application.rb
+ require “action_view/component/rail

元記事を表示

【Rails 6】(初心者向け)Ajax版最小構成CRUDアプリ(ページ移動をゼロに!)

Railsの学習で最初に学ぶのが,メッセージの作成・表示(読み取り)・更新・削除のできるCRUDアプリであると思います。私も最初にCRUDアプリを作成したときは,正直理解が追いつきませんでした:sweat_smile:

ところが,実際に作成してみるといろいろと不満が出てくることでしょう。一番は「見た目」だと思いますが,

「ボタンをクリックするたびにページを移動するのは嫌だなあ……」

と思いませんでしたか?特に本番環境では読み込みに時間がかかってしまいます。そこで,この記事では,ページ遷移ゼロの最小構成CRUDアプリを作成していきたいと思います:grinning:

通常のCRUDアプリを理解していたならば,本記事も理解できるようなるべく丁寧に解説していきます。

この記事では,Rails標準の **Ajax** の使い方を学ぶことだけに焦点を当てます。そのため,見た目・バリデーション

元記事を表示

.orderで並び替えたデータ取得時の注意点

映画レビューアプリを作成中に気づいたことです!

レビュー投稿画面に移行時に
①Movieテーブル最新データ1つ取得→ *fleshmovie = Movie.order(updated_at: :desc).limit(1)*
②最新データidカラムの値をインスタンス変数に定義→ *@movie = fleshmovie.id*

“`ruby:reviews_controller.rb
def new
fleshmovie = Movie.order(updated_at: :desc).limit(1)
@movie = fleshmovie.id
end
“`

“`ruby:error_code
[2] pry(#)> @movie
Movie Load (0.6ms) SELECT `movies`.* FROM `movies` ORDER BY `movies`.`updated_at` DESC LIMIT 1
↳ app/controllers/reviews_controller.rb:10
=>

元記事を表示

【環境構築】Docker + Rails6 + Vue.js + Vuetifyの環境構築手順

## はじめに
**Docker + Rails6 + Vue.js + Vuetify**の開発環境構築手順をまとめました。

以下の記事を参考にさせて頂きました!**ありがとうございます**:bow_tone1:

– [webpackerを使ってRuby on Rails 6.0とVue.jsを連携する方法(フロントエンド編)](https://ubiqlog.com/archives/13845)
– [Rails+Vue.js+Vuetify環境の構築手順 – Qiita](https://qiita.com/kuunii/items/a9f68c1838a019d77202)
– [【Rails6】10分でRails + Vue + Vuetifyの環境を構築する – Qiita](https://qiita.com/Ryoga_aoym/items/e1d91351389904240594)

## 環境
“`yaml
OS: macOS Catalina 10.15.1
zsh: 5.7.1
Ruby: 2.6.5
Rails: 6.0.2
Docker: 19.0

元記事を表示

Railsで排他制御

model以外で特定の処理にロックをかけたい事象が発生したので、その時の対応です。

“`ruby
module Lockable
extend ActiveSupport::Concern

class UnableLockError < StandardError; end KEY_PREFIX = 'lock/' def with_lock(key, expire = 30.seconds) real_key = "#{KEY_PREFIX}#{key}" value = SecureRandom.hex(10) raise UnableLockError unless lock(real_key, value, expire) begin yield ensure unlock(real_key, value) end end private def lock(key, value, expire) redis_client.set(key, value,

元記事を表示

ネストしたオブジェクトをYupでバリデーションする

Railsでいうnested attributesみたいなやつ :bulb:

“`rb
{
“title” => “title dayo”,
“body” => “body dayo”,
“tag_attributes” => {
“0” => { “name” => “hoge” },
“1” => { “name” => “fuga”}
}
}
“`

Yup.lazyとlodashのmapValuesを使いました。

“`ts
import * as Yup from “yup”;
import mapValues from “lodash.mapvalues”;

interface Form {
title: string;
body: string;
tag_attributes: {
[key: string]: {
name: number;
};
};
}

const validationSchema = Yup.object().shape({
title: Yup.str

元記事を表示

Ruby on Rails 初歩の初歩

#備忘録
こんにちは!HLDの井出です。(https://t.co/FiYK5Qty3J?amp=1)
今回は、Railsについての備忘録を残していきます。
インストールからscaffoldまでです。
##環境
– Windows10
– viniciusfs/centos7
– rails 5.1.3

##準備
Rubyのインストール
参考:https://github.com/rbenv/rbenv
流れは、まず管理ツールのrbenvをインストール。
          ↓
インストールできるバージョンの確認
`$ rbenv install –list`
欲しいバージョンをインストールしたら、
`$ rbenv grobal バージョン`
`$ rbenv rehash`
そして、
`$ ruby version`
で、バージョンが表示されたらOK!!

###railsのインストール
`$ gem install rails -v x.x.x` (Xは欲しいバージョン)

**その前に**
下拵えで、nodejsとsqlite3をインストールしておきます。しておかない

元記事を表示

チーム開発時にクラス名が原因で起きる問題を解決する

#はじめに
チーム開発の際にレイアウトの崩れが起きないようにする方法について投稿します。
#実行
例えばAさんとBさんが一緒に同じアプリを作っているとします。
現時点で、二人はそれぞれ次のようなファイルを作っています。

##Aさん

“`haml
.body
.body__contents1
コンテンツ1
.body__contents2
コンテンツ2
“`

“`scss

&__body{
background-color: #00F;
}
“`

##Bさん
“`haml
.body
.body__top
トップ
.body__bottom
ボトム
“`

“`scss

&__body{
color: #00F;
}
“`

Aさん作成のビューファイルでは`backround-color: #00F;`となっているので、背景が青色になり、文字色の設定はなにもないのでデフォルトの黒で表示されます。
Bさん作成のビューファイルの方は`color: #00F;`となっているので、文字色が青になり、背景はデフォル

元記事を表示

Railsでテーブルのカラム名を安全にリネームする

テーブルのカラム名を変更した時のメモ

## 環境

* Rails 5.2.4
* MySQL 5.7.28

## 背景

テーブルのカラム名がイケてないので変えたいけど、使用箇所が多いので手を出しにくい。
でもカラム名を変えたい。

## やること

1. テーブルのカラム名を変える
1. 警告を出すための独自Deprecatorを作成する
1. 変更前のカラム名でもアクセスできるようにエイリアスを貼る

警告は出るが変更前のカラム名でもアクセスできるようにしておくことで、
段階的に使用箇所を修正していけるという寸法です。

## やり方

#### 1. テーブルのカラム名を変える

普通にカラム名を変更するマイグレーションを作ります。
例としてUsersテーブルのnameカラムをfull_nameにリネームします。

“`app/db/migrate/rename_name_to_users.rb
class RenameNameToUsers < ActiveRecord::Migration[5.2] def change rename_column :us

元記事を表示

Rails6 のちょい足しな新機能を試す113(MySQL enum set 編)

# はじめに

Rails 6 に追加された新機能を試す第113段。 今回は、`MySQL enum set` 編です。
Rails 6 では、MySQL の enum や set のカラムの schema dump が正しく出力されるようになりました。

Ruby 2.6.5, Rails 6.0.2.1, MySQL 8.0.16 で確認しました。 (Rails 6.0.0 でこの修正が入っています。)

“`shell
$ rails –version
Rails 6.0.2.1
“`

今回は、users テーブル (User モデル)に `enum` と `set` のカラムを追加して試してみます。

# Rails プロジェクトを作成する

“`shell
$ rails new rails_sandbox
$ cd rails_sandbox
“`

# User モデルを作成する

`name` カラムだけもつ `User` モデルを作成します。

`enum` と `set` のカラムは、後で、migration ファイルを直接編集して、追加します。

元記事を表示

rails indexってなんだ

## indexってなんだ

検索速度をあげるモノ

## なんで上がるのか

検索して行く時通常は、上から検索されていく。

しかし、indexをはると、userテーブルの場合、アルファベット順に並び替えてくれるらしい。

## こうゆうことか?

青山で検索する

“`
#index貼らない

神田
青木
田中
青山

## データが煩雑なので、上から検索するしかない

# index貼る

青木
青山
神田
田中

## アルファベット順だからあ行の中で検索がかけられるのかな?
“`

## メリット・デメリット

– デメリットは書き込み速度が遅くなるらしい。

## 参考記事

https://qiita.com/seiya1121/items/fb074d727c6f40a55f22

負荷対策
https://qiita.com/N-qiita/items/4c9b3efdaefb32181fc9

元記事を表示

OTHERカテゴリの最新記事