Rails5で自作クラスの読み込み(app配下に置く)

自作のクラスやモジュールを読み込む場合、 Rails4だと

config.autoload_paths += %W(#{Rails.root}/lib)

みたいなのをconfig/application.rbに設定したかと思いますが、
Rails5ではこれを記述するとエラーが出ます。

■対応策 A案
 app配下は自動で読み込まれるため、そこに自作クラスを置く。
 (app配下にあるとわかりやすい&挙動調べるときはまずここを見るかと思いますので
  個人的には素直にここが最適かと思います)

以下、設定例

[app/lib/foo_bar.rb] libフォルダとfoo_bar.rbは自分で作る
class FooBar
  def hi
    return “hi.”
  end

  def bye
    return “Good bye!”
  end
end

[app/controllers/users_controller.rb] 例のためcontrollerかましています
  def index
    @foo = FooBar.new
  end

[app/views/users/index.html.erb]
<%= debug @foo.hello %> #=> hi
<%= debug @foo.bye %> #=> Good bye!

■対応策 B案
 任意の場所libフォルダとかに自作クラスを置いてrequireで読み込む。

 以下、設定例

[lib/hoge.rb] foo_bar.rbは自分で作る
class Hoge
  def hey
    return “hey there.”
  end
end

[app/controllers/users_controller.rb] 例のためcontrollerかましています
  require ‘./lib/hoge’

  def index
    @hoge = Hoge.new
  end

[app/views/users/index.html.erb]
<%= debug @hoge.hey %> #=> hey there.

■対応策 C案
 Rails4みたいにautoloadする設定を入れる。

Rails5のproduction環境でlib/配下のクラス読込みがNameErrorになるのはautoloadが無効化されたからだった

■参考サイト
Rails 5 ignoring /lib class? 
 上記の回答では、config/application.rbでrequireしろ、という内容です
Railsアプリのモジュールはどこに置くべきか問題 (公開版)
・読み込むための命名規則(ファイル名、設置場所に伴うクラス名・メソッド名)が厳密に定義されているので要注意

Rails5でMaterialize使うときのSubmitボタン実装方法

Materializeのsubmitボタンメモ

(1)form.submitはaタグのリンク範囲おかしくなる(文字しかaタグ効かない)からbutton_tag使う
(2)Enterでsubmitしないようにtype:”button”を使う
(3)type:”button”だとsubmitできないのでonclick:”submit();”を定義する

【viewのsubmitボタン実装例】
    <%= button_tag ‘投稿’, class: “btn waves-effect waves-light”, type: “button”, onclick: “submit();” %>

■参考
Input Submit Field with Materialize doesn’t work properly #1493
Enterキーを無効にする方法

Rails5 app/assets、lib/asses、vendor/assetsの使い分け

以下の理解。

・app/assetsはアプリ全体として共通管理するもの(app/assets/javascripts/application.jsとか)やアプリ固有のもの(app/assets/javascripts/posts.coffeeとか)を置く
・lib/assetsは自作コードを置く(特定のviewだけxxのファイルを読み込みたい、みたいな時はここに置いて読み込む?ここ以外に最適そうなとこがない)
・vendor/assetsはサードパーティ(外部ベンダーが提供したもの、bootstrapとか)を置く

—Railsガイドからの引用—

  • app/assetsは、カスタム画像ファイル、JavaScript、スタイルシートなど、アプリケーション自身が保有するアセットの置き場所です。
  • lib/assetsは、1つのアプリケーションの範疇に収まらないライブラリのコードや、複数のアプリケーションで共有されるライブラリのコードを置く場所です。
  • vendor/assetsは、JavaScriptプラグインやCSSフレームワークなど、外部の団体などによって所有されているアセットの置き場所です。

引用元:アセットパイプライン | Rails ガイド

■外部ベンダー提供のjs, CSSを読み込む場合の例
外部ベンダーの bootstrap-tagsinput.min.js と bootstrap-tagsinput.cssを読み込みたいとする。

1.vendor/assets/javascripts/bootstrap-tagsinput.min.js と vendor/assets/stylesheets/bootstrap-tagsinput.css にファイル置く
2.config/initializers/assets.rb に以下を定義する

Rails.application.config.assets.precompile += [
    #Bootstrap Tags Input
    ‘bootstrap-tagsinput.min.js’,
    ‘bootstrap-tagsinput.css’
]

3.railsを再起動する
4.読み込みたいviewで、stylesheet_link_tag と javascript_include_tag を使って定義したファイルを読み込む

Rails5 CoffeeScriptで「プロパティ:値」を複数書くときは改行するだけ

jQueryでよく使う「({ ・・・ });」の複数のプロパティと値を一括で指定する方法をCoffeeScriptでやる場合は改行で指定する。
(例)
————————————————————–
$ ->
  $(‘.datepicker’).pickadate
    selectMonths: true
    selectYears: 100
    max: true
————————————————————–

CoffeeScriptとjQueryで書いた場合の例

MacのPostgres.appはDB名をダブルクリックで対話モード開始

Postgres.appをインストールして起動したあと、DB名をダブルクリックすると対話モード($ psql postgresの実行)に入れる。

ドキュメント見ても載ってなくて最初わからなかった。

■備考
1.Rubyでの設定方法もあったが、特に何もしなくてもPostgres.app動いてる。
Configuring Ruby for Postgres.app
 2.ただし、bundle installすると「checking for pg_config… no」と怒られるので以下Qiitaの記事で書かれた対応が必要。Gemfileに書いて開発してるかと思うので、「Gemfileに書いている時には環境変数CONFIGURE_ARGSを設定する」と書かれてる対応を実施する。
Postgres.appを使ってPostgreSQLを使う場合に、gem ‘pg’を入れる方法

Rails5でMaterial Design Lite動かないのでturbolinksは切る

Material Design Liteがうまく動かないのでTurbolinksを切ったら、ちゃんと動くようになった。

■Turbolinksの切り方
以下、引用。

1) Remove the gem ‘turbolinks’ line from your Gemfile.
2) Remove the //= require turbolinks from your app/assets/javascripts/application.js .
3) Remove the two “data-turbolinks-track” => true hash key/value pairs from your app/views/layouts/application.html.erb .

 引用元:How to disable turbolinks in Rails 5?

3)は丸ごと行を削除でOK。

■メモ
・TurbolinksはReact使う時も切るのがよいとのことで、なるべく切る
・「rails new my_app –skip-turbolinks」でTurbolinksを無効にして作成できる
・「rails g scaffold」した時はturbolinks有効にしないと動かないものがあるっぽいので注意

Rails, React, Material Design関連のキーワード自分用まとめ

自分用まとめ。誤りあったらごめんなさい(すぐ修正します)。

■前提知識
・Homebrew:macOS用に使うパッケージを管理してくれる。似たものでMacPortsもあるがHomebrewで実装されていることが多いっぽい

■Rails関連のキーワード
・rbenv(Simple Ruby Version Management):Rubyをバージョン切り替え管理できる
・Rails 5.1からフロントエンド周りの強化としてYarnとWebpackerが実装されて、React実装がかんたんになった
Yarn(A new package manager for JavaScript):RubyGemsっぽいもの
Webpacker:JavaScriptアプリをRailsでかんたんに扱えるようにしたものっぽい
・Gemは使わなくてよいなら極力使わないこと。下手に使うと依存関係の修正対応が延々と終わらない。「使われなくなっている/使わないGem」などで調べるといろいろ見つかる

■React関連のキーワード
Node.js:JavaScriptで動かせる実行環境。これなくてもRailsに実行環境を用意すれば動かせる
npm(Node Package Manager):Node.jsで使うパッケージを管理してくれる。Node.jsインストールすると一緒に付いてくる。Railsだけで動かしているとパッケージの依存関係が大変になるので本気でやるならこれがいるっぽい
・実装は、Rails 5.1のYarnとWebpacker使った方法や、Gemfileに「gem ‘react-rails’」でインストールする方法などがある
・シングルページアプリケーション(SPA)を作らないなら無理してReact使わなくてよい。Reactのよさが活用できそうにないなら自分の得意なものを選択したほうが効率よい
・UIだけならMaterial Design使えばよい
・Reactやると、学習コストがReact以外に関連技術(実行環境とか)もいろいろ必要になるので大変そう。Reactのコードや学習自体が難しいわけではない
・React Native:JavaScriptで開発して、iOSとかAndroidのようなネイティブな描画ができる。

■React Native
React Native:React NativeのviewはiOSのUIViewにしてくれる。ただし、さらに関連技術(Redux/Fluxとか)の学習が必要。発展途上なので2017/10時点だといろいろと開発が大変らしい

■Material Design(CSSフレームワークとしての)関連のキーワード
Material Design Lite:Google作成。コンポーネント足りないものがややあり。これの後継になるMaterial Components for the Webが発表された
Material Components for the Web: Google作成。コンポーネントが相当豊富でなんでも揃ってる
Materialize:すごい学生さんたちがMaterial Designに則って作成。jQuery依存あり。コンポーネントが相当豊富でなんでも揃ってる。GitHub上も活発
Material-UI:Reactを使ってMaterial Designを実装となる。Call-Em-Allという会社が作成
・RailsでインストールできるGem(rubysamurai/material_design_lite-sass など)もあるが、Material Design Liteの実装自体が非常にかんたんなので、どんなシーンでこのGemを利用すべきか不明

■わかりやすい参考サイト
Rails関連
依存関係をなくそう : Rubyアプリ・Gemの開発者への提言

React関連
Rails 5.1でReact.js連携アプリを構築してみよう
react-railsを使ってReactのTutorialをやってみる
react + rails 構成パターンまとめ。npm とか bower とか一体何なんだよ!Javascript 界隈の文脈を理解しよう
React系(別言語含む)の サーバーサイドレンダリング について考えよう
シングルページアプリケーション(SPA)の導入メリット&デメリット

React Native
React Native開発のつらい点まとめ

Material Design(CSSフレームワーク)関連
マテリアルデザインをサクッと実装できるCSSフレームワーク6選【2017年版】
CSSフレームワークを使って今から始めるお手軽マテリアルデザイン

Rails5でSQLiteからPostgreSQLに変更した時のメモ

■PostgreSQL側でCREATEDB権限がない時のエラー
———————————————————————
$ rails db:setup
PG::InsufficientPrivilege: ERROR:  permission denied to create database
———————————————————————
config/database.ymlで設定書いたユーザーにCREATEDB権限があるかどうか、PostgreSQL側で確認する。

■CarrierWaveで複数画像を投稿するとエラー
1.SQLiteとPostgreSQL/MySQLで実装方法が異なる。PostgreSQLの実装にする。
(参考)CarrierWave –  Multiple file uploads
(参考)CarrierWave 複数の画像をコード三行で一つのカラムに保存する ※PostgreSQL/MySQLの実装方法でSQLiteではない

2.複数画像を投稿時に以下エラーが出る場合は構文を書き間違えている可能性あり。
———————————————————————
TypeError in UsersController#create

no implicit conversion of nil into String
———————————————————————
(参考)Stack Overflow – “no implicit conversion of nil into String” error for carrierwave multiple image upload
「mount_uploaders」ではなく「mount_uploader」と書く。

———————————————————————
# app/models/users.rb
class User < ApplicationRecord
  # 画像1つのみアップロードする場合。imageカラムに格納指定。
  mount_uploader :image, ImageUploader
  # 複数画像アップロードする場合。image_anotherカラムに格納指定。
  mount_uploaders :image_another, ImageUploader
end
———————————————————————

PostgreSQLコマンドメモ

■PostgreSQLの対話的ターミナルの入り方
————————————————————————-
$ psql postgres
postgres=#
————————————————————————-

■DB名を指定してフル権限を付与する – GRANT
DB名「db_development」にユーザー「user_development」をフル権限(ALL PRIVILEGES)で付与する。
————————————————————————-
postgres=# GRANT ALL PRIVILEGES ON DATABASE db_development TO user_development;
GRANT
postgres=# l
————————————————————————-
補足:最後に「;」をつける
補足:DB名を指定する場合は「ON DATABSE」をつける。これがないとテーブル名指定になる

■DB作成権限を付与する – ALTER ROLE
ユーザー「user_development」に「CREATEDB」権限を付与する。
————————————————————————-
postgres=# ALTER ROLE user_development WITH CREATEDB;
ALTER ROLE
postgres=# du
————————————————————————-
https://www.postgresql.jp/document/8.1/html/sql-alterrole.html

■RailsでPostgreSQL使う場合に最初にやること
PostgreSQLの管理系コマンドまとめ

■参考情報
PostgreSQL 9.1.5文書 – GRANT
PostgreSQL 8.1.9文書 – ALTER ROLE

nio4rインストールエラーはxcode起動して同意ボタン

bundle installしたときの、nio4rインストールエラーはxcodeがないとか動かせないとからしい。
ERROR:  Error installing nio4r:
    ERROR: Failed to build gem native extension.
自分の場合は、macでxcodeを起動したら同意ボタン押せっていう画面出てたので、それをクリックしたらbundle install成功した。xcodeを今まで起動してなかったか、xcodeのverアップしたから同意待ち(なのでxcode起動できない)になってたようです。