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

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

【Rails環境構築】MySQL2が原因で「bundle install」失敗した時の対処法

# はじめに
Railsの環境構築をローカルでしようと*rails new*からはじめたところ、`bundle install`ができずに引っかかったため備忘録として残しておきます。

# 環境
OS : Mac OS Catalina 10.15.1
Ruby : 2.6.3p62
Rails : 6.0.1
Homebrew : 2.1.16
Bundle : 1.17.2

# エラー

“`
$ bundle install

省略(gemのインストール)

Installing mysql2 0.5.2 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

省略

An error occurred while installing mysql2 (0.5.2), and Bundler cannot continue.
Make sure that `gem

元記事を表示

binding.pryでデバック

#【その1】gemを追加
“`ruby:Gemfile
gem ‘pry-rails’
“`

“`
bundle install
“`

いつものごとくサーバーを再起動します。

“`
rails s
“`

なぜなら、サーバーを起動した際にgemが反映されるからです。

#【その2】デバックしたいところにbinding.pry
“`ruby:tweets_controller
def create
Tweet.create(tweet_params)
binding.pry
end
“`

実際のページでcreateアクションを動かします。
投稿ができずに処理が止まるはずです。

#【その3】ターミナルで値を確認
ターミナルを見ます。
paramsと打つと、何が入っているのかわかります。

“`terminal
[1] pry(#)> params
=> “✓”, “authenticity_token”=>”cFfq1a/zC8fM

元記事を表示

deviseの超便利ヘルパーまとめ

#deviseのヘルパーメソッド

| メソッド | 機能 |
|:——|:—-|
| current_user | 現在ログインしているユーザーのインスタンス |
| user_signed_in? | ユーザーがログインしているか |
| before_action :authenticate_user! | ログインしていない場合はログイン画面に遷移させる |
| after_sign_out_path_for | ログアウト後のリダイレクト先を指定 |

#【current_user】
現在ログイン中のユーザーのレコードをインスタンスとして取得できるメソッドです。
モデル間でアソシエーションを組んでいる場合、子要素・親要素の取得も可能です。

“`ruby
current_user.name
#ユーザーの名前

current_user.tweets
#ユーザーが保持するツイートすべて
“`

#【user_signed_in?】
ログインしている場合true
ログインしていない場合false
を返します。

“`
<% if user_signed_in?

元記事を表示

orderメソッドで新しい順に

orderを使うと、データベースから取得した複数のレコードを並び替えることができます。
今回はツイートの投稿日が新しいものが上に来るようにします。

#使い方
“`ruby
.order(“カラム名 順序”)
“`
順序は、ASC(昇順)とDESC(降順)があります。

#使用例
“`ruby:tweets_controller
def index
@tweet = Tweet.all.order(“created_at DESC”)
end
“`
allですべて取得し、それを投稿日の降順で並び替えます。

また、allは省略できます。

“`ruby:tweets_controller
def index
@tweet = Tweet.order(“created_at DESC”)
end
“`

ではまた!

元記事を表示

RailsでフォームのレイアウトをMaterial-uiにしてみた

RailsではBootstrapを使うのが手軽だと思いますが、見慣れたデザインで面白くないので、今回は
ユーザー登録画面をMaterial-uiのデザインにしてみたいと思います。

#準備

・以下の記事を参考にreact-rails,material-uiのインストールを行ってください。
https://qiita.com/anx/items/a6039f9ccf2bd835194d (既存のRailsアプリにReactを導入する方法)
https://qiita.com/anx/items/8bf9855a2118e96dfe5c (react-railsでMaterial-ui)
・ユーザー登録機能を実装しておいてください

#実装

まずはSignUpコンポーネント作成します。

“`ruby:
$rails g react:component SignUp
“`

次にログイン画面のviewファイルに以下を追記し、SignUpコンポーネントを呼び出します。

“`ruby:/app/views/users/new.html.slim
= react_componen

元記事を表示

Railsを使ってチャットアプリを作る

#はじめに
Railsを使って簡単なチャットアプリを作ったので、その時の手順をまとめました。

![chat-app.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371652/c0946340-a331-a933-80d5-9740a67605d1.gif)

#環境
“`:
$ ruby -v
ruby 2.5.1p57 (2018-03-29 version 63029) [x86_64-darwin19]

$ bin/rails -v
Rails 5.2.3
“`

#参考
以下を参考にさせて頂きました。

[Action Cableでリアルタイムチャットアプリの作成方法 (Rails 5.1.4にて)(その1) herokuで動かす!](https://qiita.com/Hijiri-K/items/c3774c72a2cb68e1a720)

#ソースコード
チャットアプリのソースコードは以下で確認できます。
[Neufo/rails-sample-app/ChatApp](http

元記事を表示

railsのsidekiqのdelayの注意点

# 気軽に非同期処理ができる
config/initializers/sidekq.rbに
Sidekiq::Extensions.enable_delay!
を追加すると、Hoge.delay.hogehoge
で気軽に非同期処理ができる

# 注意点
インスタンスメソッドでdelayするとよくわからないエラー起きるみたいなので、
クラスメソッドで使用する。

Sidekiqでdelayを使う。しかし、クラスメソッドを使いダイナミックなQueue名を使わない

元記事を表示

#Rails + #rspec で rake を実行する方法を毎回忘れるので書き留めておく ( LoadError: Can’t find 対策 )

# まとめ

– 公式なやり方ではなく、あくまで内部メソッドやらをHackして利用するやり方っぽいので煩雑で使いにくいことは心える
– rake_require で元のrake fileさえloadできたら勝ち
– rake_require ではタスク名でも階層でもなく、単にファイル名とディレクトリパスを与えているところがポイント
– 一度rake file をrequireしてしまえば、task invoke できる
– うまくrequireできない場合は `Rake.load_rakefile` など内側のメソッドを使って、パスが正しいかどうかひたすらチェックせよ

# rake

`/app/lib/tasks/foo/bar.rake`

“`rb
namespace :foo do
task bar: :environment do |task|
SomeClass.run
end
end
“`

# rspec

“`rb
require “rails_helper”
require “rake”

describe do
before(:all

元記事を表示

Ruby on railsの基本箇所についての復習①(フォルダを作る)

#はじめに
Ruby on rails(以降rails)を使って、簡単なアプリを作るまでの手順を、なるべく細分化して書いていこうと思います。
#実行
railsアプリを作成するのに必ずしなければいけないのは***アプリのフォルダを作ることです***。
これはターミナル上でrailsコマンドを入力できます。

今回は、`sample`という名前のアプリを作っていきます(名前はなんでもいいです)。
最初にアプリを作る場所(ディレクトリ)を決めます。どこでもいいのですが、今回はデスクトップ上に作成しようと思います。
まずはターミナルでデスクトップに移動します。

“`terminal
cd desktop
“`

移動したら次はアプリのフォルダを作ります。
アプリのフォルダは、移動したディレクトリで`rails _railsバージョン_ new アプリ名 -d mysql`というrailsコマンドを実行すれば良いです。
railsのバージョンは、ターミナル上で`rails -v`と入力すればわかります。筆者の場合はこの記事を書いている時点で`Rails 5.2.3`となっています。アプリ

元記事を表示

【Rails】flashの使い方

flashを利用して、アクション実行後に簡単なメッセージを表示させることができます。
ログイン周りの処理において特に重宝されます。
(Sessionはモデルを持たない→ActiveRecordがエラーメッセージを吐かないから)

##使い方
`flash[:<キー>] = <メッセージ>`で登録し、`flash.each do |message_type, message|…`で出力します。

##`flash`と`flash.now`
flashの仲間に`flash.now`があり、
`flash`→次のアクションまでデータを保持する→`redirect_to`と一緒に使う
`flash.now`→次のアクションに移行した時点でデータが消える→`render`と一緒に使う
という使い分けが必要です。

##TODOアプリにflashを実装する
簡単なTODOアプリにflashを実装していきます。
・[Ruby on Railsで簡単なアプリを作成](https://qiita.com/d0ne1s/items/5e63dde992f20f25b8bb)
・[RailsアプリをHe

元記事を表示

Rails/アンチパターン: 一見すると存在しないアクション

何の変哲も無い(?)コントローラー。これはエクスポート処理関連の各種コントローラーの親クラス

“`ruby:controllers/export_controller.rb

class ExportController < ApplicationController def some_method やりたい処理 end end ``` そして、何もないHogeController。よく見るとExportControllerを継承している。これを見落とすとやばい ```ruby:controllers/hoge_controller.rb class HogeController < ExportController end ``` 最後にrouting。HogeControllerのsome_methodアクションにroutingしている ```ruby:routes.rb get '/hoge', to: 'hoge#some_method' ``` # 何が問題か * アクション=そのcontrollerに定義するという設計スタイルの

元記事を表示

学びメモ(11月)

学んだことを残していきたいと思います。参考にさせていただいた記事を書いた方々には心から感謝します。

#[CSSのposition: absoluteとrelativeとは](https://uxmilk.jp/63409)
基本形
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141176/e1f3760d-c051-c75f-e634-1b1144b4792b.png)

###absolute
青色のbox2に{ position: absolute; top:150px; left:100px } を指定。
absolute を指定した要素は高さがなくなり、浮いたような状態になるため、box3はbox2を無視して位置を詰める。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141176/ae59f078-37c0-ca19-463d-da05706d1670.png)

###re

元記事を表示

[Ruby] 継承可能なクラス属性を定義する

# やりたいこと

継承可能なクラス属性を定義したい。

“`rb
class A
self.x = :hoge
end

class B < A end class C < B self.x = :fuga end A.x #=> :hoge
B.x #=> :hoge (親の x を継承する。)
C.x #=> :fuga (再定義した場合はその値を使う。)
“`

# たったひとつの冴えたやり方

Active Support コア拡張の [Class#class_attribute](https://api.rubyonrails.org/classes/Class.html#method-i-class_attribute) を使う。

“`rb
require ‘active_support/core_ext/class/attribute’

class A
class_attribute 😡

self.x = :hoge
end

class B < A end class C < B self.x = :fuga end A.x

元記事を表示

【Rails】テストについて

# テストの種類

単体テスト モデルやビューヘルパー単体の動作をチェック
機能テスト コントローラ/ビューの呼び出し結果をチェック
統合テスト ユーザーの実際の操作を想定し、複数のコントローラにまたがるアプリの挙動をチェック

## 単体テスト
Railsで行うテストの中で、最も基本的なテスト
アプリを構成するライブラリ(主にモデル)が、正しく動作するかをチェックする

“`ruby:test/models/user_test.rb
require ‘test_helper’

class UserTest < ActiveSupport::TestCase def setup @user = User.new(name: 'Example User', email: 'user@example.com' end test "should be valid" do assert @user.valid? end end ``` assertメソッド: 第1引数がtrueである場合、テストが成功したものとする setupメソッド : テス

元記事を表示

#Rails + rails console の pry でエラー情報が少なすぎて辛いのでスタックトレースを表示する様にする設定例

`config/initializers/pry.rb`

“`rb
Pry.config.exception_handler = proc do |output, exception, _pry_|
output.puts “#{exception}”
output.puts “#{exception.backtrace}”
end
“`

[Exceptions · pry/pry Wiki](https://github.com/pry/pry/wiki/Exceptions#Exception_handler)

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2765

元記事を表示

#Rails + rake でタスク名を標準出力・ログ出力する例 ( how to Log or STDOUT task name on rake with Rails )

“`ruby
namespace :foo do
task run: :environment do |task|
puts task.name
puts Rails.logger.info task.name
end
end
“`

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2764

元記事を表示

#Rails + rake で 定数参照できない実行エラー : NameError: uninitialized constant ModelName

environment指定をすること

“`diff
namespace :foo do
– task :run do
+ task run: :environment do
::ModelName.bar
end
end
“`

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2763

元記事を表示

Hamlの基本箇所についての復習④(ネスト)

#はじめに
飽きもせずHamlの基礎について書いていきます。
今回はクラスのネストについてです。
#実行
例えば、htmlで次の様に書かれているとします。

“`html

“`
`wrapper`という大きなクラスがあり、その中に`top`と`down`という小さなクラスが二つあります。
このように親要素・子要素があるhtmlファイルだと、ちょっとした書き間違えが起こります。例えば次のようなものです。

“`html

“`
これは`

`の閉じタグがない状態です。これだとCSSがちゃんと適用されないなどのエラーが起きます。
単純なミスですが、意外と気づきにくく、エラー解決まで時間を要することも少なくないです。

しかし、Hamlを使えばこの問題を多少なり解決することができます。
前述のコードをHamlで

元記事を表示

【Rails】we’re sorry, but something went wrongでハマった話(2)

こんにちは!スージーです!
ローカル環境では問題なかったのに本番環境で発生した`we’re sorry, but something went wrong`の解決までを備忘録として

## we’re sorry, but something went wrong
このエラーは本番環境でちょいちょい見るので`production.log`でエラーログを確認する

“`terminal:ターミナル
[ec2-user@ip-~~]$ cd /var/www/app-name
[ec2-user@ip-~~]$ cd log
[ec2-user@ip-~~]$ cat production.log
D, [2019-11-18T07:06:44.834244 #5661] DEBUG — : hogehoge~~
D, [2019-11-18T07:06:44.834597 #5661] DEBUG — : hogehoge~~

・・
・・・
“`
この時は`production.log`にエラーログが無かった

## デバックを考える

– `タイポ`→×
開発環境でもエラー

元記事を表示

Rails6 のちょい足しな新機能を試す107(Digest::UUID編)

# はじめに

Rails 6 に追加された新機能を試す第107段。 今回は、 `Digest::UUID` 編です。
Rails 6 では、 `Digest::UUID` が require なしで使えるようになりました。

Ruby 2.6.5, Rails 6.0.0, Rails 5.2.3 で確認しました。

“`shell
$ rails –version
Rails 6.0.0
“`

今回は、簡単なスクリプトを作って確認します。

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

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

# スクリプトを作成する

`Digest::UUID` を使ったスクリプトを作成します。

“`ruby:scripts/uuid.rb
puts Digest::UUID.uuid_v3(Digest::UUID::DNS_NAMESPACE, ‘rubyonrails.org’)
puts Digest::UUID.uuid_v4
puts Digest::UUID.u

元記事を表示

OTHERカテゴリの最新記事