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

Rails関連のことを調べてみた2019年11月15日
目次

enumで、キーの文字列に数字を含める方法

*前提*

“`Rails:schema.rb
t.integer “sex”
t.integer “age”
“`

通常のenum(文字列のみ)の書き方は以下の通り。

“`Rails:user.rb

enum sex: { 未選択: 0, 男性: 1, 女性: 2 }
“`

enumで数字を含めるには以下のように

“`Rails:user.rb

enum age: { 未選択: 0, “10代”: 1, “20代”: 2, “30代”: 3, “40代”: 4, “50代”: 5, “60代”: 6, “70代”: 7, “80代”: 8, “90代”: 9 }

“`

キーをダブルクオーテーション(“”)で囲えば良い。
むしろ本来こんなふうに書くべきなのかもしれない。

元記事を表示

【Rails】 form_for でプルダウン(セレクトボックス)を実装してみる

# 概要

今回はrailsアプリケーションにおいてフォームを送信する際に、以下のような簡単なプルダウンを実装できるようにします。

![スクリーンショット 2019-11-15 3.34.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409257/31f1560e-fc23-9124-2a44-b54738630943.png)

![スクリーンショット 2019-11-15 3.35.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409257/3b334d3d-66f1-9389-d217-f98be69e351e.png)

## 例
上記の例は以下のようなコードで実装できます。

“`ruby:hoge/view/new.html.erb
<%= form_for @hoge do |f| %>
# 以下の一行がプルダウンを実装するためのコード
<%= f.select :faculty

元記事を表示

フォロー機能 User.rbとRelationship.rb

“`Rails:Relationship.rb
class Relationship < ApplicationRecord belongs_to :follower, class_name: "User" belongs_to :followed, class_name: "User" end ``` Relationshipモデル(中間モデル)には、 :boy:follower (フォローする人) :two_women_holding_hands:followed(フォローされる人) が存在している。 ```Rails:user.rb has_many :follower, class_name: "Relationship", foreign_key: "follower_id", dependent: :destroy # フォロー取得。Relationshipモデルのfollower_idにuser_idを格納 has_many :followed, class_name: "Relationship", foreign_key: "followed

元記事を表示

ユーザ一覧で”フォローする”ボタンを押したときの挙動 備忘録

“`Rails:user/index/html.erb

<% if user != current_user %>

<% if current_user.following?(user) %>
<%= link_to 'フォロー解除', unfollows_path(user.id), method: :POST %>
<% else %>
<%= link_to 'フォローする', follows_path(user.id), method: :POST %>
<% end %>

<% end %>
“`
上の ‘フォローする’ ボタンを押すと、follows_path が読み込まれる

follows_pathは

“`Rails:routes.rb

post ‘follows/:id’ => ‘relationships#follows’, as: “follows” # フォローする。follows_pathの作成。
“`
上の as “fol

元記事を表示

【rails】jQueryでページカレントをつけようとして読み込み問題でハマった話

#まずは完成図gif
![a7abc847458f31a52675d3b296bed1fc.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480700/7c7a3e10-0ba6-d13c-f2df-f618c1878adf.gif)
なんの変哲もなく、しっかりとページカレントできています。

#書き加えたコードはこれ

“` sidebar.js
$(window).load(function () { //.loadでページが完全に読み込まれたら実行されるようにする

var href = $(“.main-header__left-box__current-group”).data(“group-id”)
$(“.group”).each(function (i, ele) {
if ($(ele).data(“group-id”) === href) { //group__side_currentが色の変わるclass
$(this).addClass(“group

元記事を表示

Railsで三項演算子をrenderする時、カッコつけないといけない。

## 結論から

“`erb
<%= 条件 ? (render '部分テンプレート名') : (render '部分テンプレート名') %>
“`

## Syntax Errorになります

“`erb
render ‘部分テンプレート名’
“`
この部分に()をつけないと、Syntax Errorになる。

## 最後に
なんかRuby書いてる時に()とか{}とか;とか書いてると大丈夫?って気分になる。
他の言語と同じノリで良いなら、全然つけるし、
省略できるくらいに考えるのになあ。。

Rubyの思想に反する気もするので、出来るだけスマートに書きたい。
みなさんどうでしょうか?
終わり!

元記事を表示

開発環境の構築からRails新規作成まで

#概要
macを新しく買いOSもCatalinaになったので今更ながら開発環境の構築をまとめようと思います。
この記事では一からmacに開発環境を構築する方法からRailsで新規のプロジェクトの作成までを書いていきます。他にgitやDockerやAWSはまた暇な時に書けたらと思います。
手順は以下の通りです。
①Homebrewの導入
②rbenvインストール
③Rubyのインストール
④Bundlerのインストール
⑤mysqlのインストール
⑥Railsアプリ作成
以上6つの手順を踏んでいきます。
環境は以下の通りです。
PC: macbookpro2018 13inch OS Catalina ver.10.15.1
Catalinaからbashではなくzsh方式になったためコマンドプロンプトもzsh方式になってます。

#Homebrewの導入
Homebrewは開発に必要なものを簡単に導入でき、管理しやすい便利なツールです。
まずはこのツールから導入していきましょう。
先にXcodeが必要になりますが、Homebrewの途中でインストールさせられるので今回はしないでいきます。

元記事を表示

rails_admin + cancancanで「undefined method `new’ for nil:NilClass」というエラーが出る

# 結論から

“config/initializers/rails_admin.rb“の設定を次の様に変更したら直りました。

“`ruby:config/initializers/rails_admin.rb
RailsAdmin.config do |config|

# 変更前
config.authorize_with :cancan

# 変更後:
config.authorize_with :cancancan

end
“`

# 環境

|項目|version|
|:-:|:-:|
|ruby|2.5.1|
|rails|5.2.3|
|rails_admin|2.0.0|
|cancancan|3.0.1|

# どうやってこの解法が分かったか

スクリーンショット 2019-11-14 午後9.42.08.png【サンプルアプリ作成】accepts_nested_attributes_forを使ったRailsの複数の子レコード同時作成、同時更新(Not gem)

# accepts_nested_attributes_forを使った複数の子レコード同時作成、同時更新モッグを作る

手順

1. Rails新規アプリ作成
2. rails g scaffoldで親と子を作る
3. アソシエーション(accepts_nested_attributes_for)
4. view修正(fields_for)
5. controller実装(attributes)
6. 完成

## rails新規アプリ作成

今回は一行のコマンドで`rails new`から`db:create`までやりたいと思います。
railsのバージョンは5.2.3でデータペースはpostgresqlを使用します。

“`
rails _5.2.3_ new sample-app -d postgresql && cd sample-app && bundle install –path vendor/bundle && rails db:create
“`

## rails g scaffoldで親と子を作る

まずはscaffoldで不要ファイルが生成されないように設

元記事を表示

【解決】An error occurred while installing sqlite3 (1.3.11), and Bundler cannot continue. Make sure that gem install sqlite3 -v ‘1.3.11’ succeeds before bundling.

# bundle installでSQLite3がインストールできないエラー

“`
$ bundle install
“`

したら**SQLite3**でエラー(ターミナル)

“`
vagrant@ubuntu-xenial:~/workspace/rails_base_exam/mofmof_exam/mofmof_app$ bundle install
Fetching gem metadata from https://rubygems.org/………….
Fetching additional metadata from https://rubygems.org/..
Using rake 11.2.2
Using concurrent-ruby 1.0.2
Using i18n 0.7.0
Using minitest 5.9.0
Using thread_safe 0.3.5
Using tzinfo 1.2.2
Using activesupport 5.0.0
Using builder 3.2.2
Using erubis 2.7.0
Us

元記事を表示

【解決】An error occurred while installing nokogiri (1.10.5), and Bundler cannot continue. Make sure that `gem install nokogiri -v ‘1.10.5’ –source ‘https://rubygems.org/’` succeeds before bundling.

# bundle installでNokogiriがインストールできないエラー

“`
$ bundle install
“`

したら**Nokogiri**でエラー(ターミナル)

“`
vagrant@ubuntu-xenial:~/workspace/rails_base_exam/insta_exam$ bundle
Fetching https://github.com/stympy/faker.git
The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32, java. To add those platforms to the bundle, run `bundle lock –add-platform x86-mingw3

元記事を表示

capybara-webkitのビルドで’cstddef’ file not foundが出て失敗する

古いシステムのメンテナンスで、ひさびさに環境をつくったらハマったのでメモ。
macOS 10.13/Xcode10以降で、`fatal error: ‘cstddef’ file not found`が出てビルドに失敗する。

#### 結論(2019/11/12時点での確認)
`1.15.1`以上になるよう指定する。とりあえず1.15.1以降であればOK。

“`
gem ‘capybara-webkit’, ‘~> 1.15.1’
“`
とか

“`
gem ‘capybara-webkit’, ‘>= 1.15.1’, ‘< 1.16' ``` みたいにバージョンを指定してからbundle installでOK。`'< 2'`でもいい。 個別にやるなら以下で。 ```gem install capybara-webkit -v '1.15.1' --source 'https://rubygems.org/'``` --- #### 参考 この記事そのままで解消できましたので感謝。 原因、および公式のPull Requestのリンクなど。qt5.5の問題がまだ解決されて

元記事を表示

Ruby on Rails チュートリアル第7章 ユーザー登録

#ユーザー登録
 この記事ではrailsで作成したアプリのユーザー登録機能を実装する方法について説明する。
 まず、ユーザーの名前とプロフィールを表示するユーザーページを作成する。そのため、まずデータベースにユーザーが登録されている必要がある。コンソールで以下のように入力し、ユーザーを一人追加する。このユーザーのidを1とする。

“`ruby
$ user = User.new(name:”YSD”,email:”foobar@gmail.com”,password:”foobar”,password_confirmation:”foobar”)
“`
そしてRESTアーキテクチャの習慣に従い、ユーザー情報をプロフィールページに表示するために、

“`ruby:config/routes.rb
Rails.application.routes.draw do
root ‘static_pages#home’
get ‘/help’, to: ‘static_pages#help’
get ‘/about’, to: ‘static_pages#abou

元記事を表示

Railsチュートリアル 第9章 発展的なログイン機構 – [Remember me] のテスト

# [Remember me] ボックスをテストする

## ありがちなミス

### うまく動かない実装

“`ruby:
params[:session][:remember_me] ? remember(user) : forget(user)
“`

このコードはうまく動きません。理由は以下です。

1. Railsチュートリアルにおける実装上、`param[:sessions][:remember_me]`の値は、`’0’`か`’1’`になる
2. Rubyの言語仕様上、`false`と`nil`以外は、真偽値として評価した場合に全て`true`として評価される

結果、このコードでは常に`remember(user)`が実行されてしまいます。

### 正しい実装

この場合、正しい実装は以下になります。

“`ruby:
params[:session][:remember_me] == ‘1’ ? remember(user) : forget(user)
“`

## テスト内でユーザーがログインするためのヘルパーメソッド

### コントローラーの単体テスト

元記事を表示

rails serverをバックグラウンドで実行する

## コンソールにログを出したくないとき

-d オプションを使う

“`sh
# 開始するとき
$ rails server -d

# 終了したいとき
$ kill -9 $(cat tmp/pids/server.pid)
“`

## コンソールにログを出したいとき

& を使う

“`sh
# 開始するとき
$ rails server &

# 終了したいとき
$ kill $(jobs | grep rails | sed -e “s/\[\([0-9]*\)\].*/%\1/g”)
“`

元記事を表示

簡潔にflashメッセージを実装する。

#基本の書き方

コントローラー

“`ruby:xxx_controller.rb
if article.save
flash[:success] = “成功したよ!”
redirect_to root_path
else

“`

ビュー

“`xxx.html.haml
= flash[:success]
“`

これでsaveが完了したら、フラッシュメッセージが表示されるようになったよ!
やったね!!

大参考
>https://www.pikawaka.com/rails/flash

元記事を表示

ActsAsPublishable 作ってみた

公開フラグの立ってるものだけを取るのをうまいこと書きたかったので、[acts_as_paranoid](https://github.com/ActsAsParanoid/acts_as_paranoid)をまねて作ってみた。

`:disabled` はコントローラから有効無効を制御する用。
(↑ユーザー権限が管理者のときは全部出したいなどという目的)

Rails素人にはこれが限界。

“`ruby:ActsAsPublishable
module ActsAsPublishable
thread_mattr_accessor :disabled

module Publishable

def published?
self.published_at.present?
end

def self.included(base)
base.extend ClassMethods
end

module ClassMethods

def published_default_scope

元記事を表示

メモ(YAML関連)(シードファイル・フィクスチャファイル)(スキーマも)

テストを書く際に、使用するYAMLの書き方がわからなくなったので整理してみた。
関連づけがある場合どうすりゃえんや

ActiveRecord経由でDBに接続するには、
config/ymlで

##YAMLとは
構造化データの記述に適したファイル形式
構造をインデントや、記号で表現する

パラメーター名:値
の形式で表すのが基本

例えば

“`ruby:
production:
database: db/production.sqlite3
“`

これはproductionパラメータのサブパラメータdatabaseを表す。
値はdb/production.sqlite3

インデントは必ず空白で表現する(一般的には半角スペース二つ)

##シードファイルとフィクスチャ
スキーマ用意後 → データを初期化する必要性
 ここで、データを初期化するために、シードファイルか、ファイクスチャと言う二つのアプローチを提供

・フィクスチャは**テストデータの投入**に使う
・シードは**マスターテーブルの初期データを投入**するために利用するのが基本

##シードファイル
単な

元記事を表示

rail チートシート ルーティング編

ルーティングについて一括で見れるチートシートが欲しいので
作ることにしました。

# 基本

“`ruby:config/routes
Rails.application.routes.draw do
get ‘homes’ => ‘home#index’
get ‘homes/new’ => ‘home#new’
post ‘homes’ => ‘home#create’
end
“`

# ルート

“`ruby:config/routes
Rails.application.routes.draw do
root ‘homes#index’
end
“`

# resourcesメソッド

“`ruby:config/routes
Rails.application.routes.draw do
resources :items #items_controllerに対してのresourcesメソッド
resources :users, o

元記事を表示

rails 発展その14 あいまい検索

検索機能についてあいまいだったので
改めてその備忘録を書きます。

# LIKE句
LIKE句は、曖昧(あいまい)な文字列の検索をすることができるもので、whereメソッドと一緒に使います。

基本はこちら

“`ruby:controller
モデルクラス名.where(‘検索するカラム名 LIKE(?)’, “検索するキーワード”)

# 例
def search
@products = Product.where(‘title LIKE(?)’, “%#{params[:word]}%”).limit(5)
end
“`

%と_の意味はこんな感じ

| 文字列 | 意味 |
|:–|:–|
| % | 任意の文字列(空白文字列含む) |
| _ | 任意の1文字 |

サンプルだとこのような形になります

| 実行例 | 詳細 |
|:–|:–|
| where(‘title LIKE(?)’, “A%”) | Aから始まるタイトル |
| where(‘title LIKE(?)’, “%B”) | Bで終わるタイトル |
| whe

元記事を表示

OTHERカテゴリの最新記事