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

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

Ruby on Rails チュートリアル 第14章 フォローフォームでのAjaxの採用

#Ajaxの使用法と効果
 ここではRailsチュートリアル14章におけるフォローフォーム作成の際にAjaxを導入する方法及びその効果について説明する。
 まず、Ajaxの導入方法については、フォーム側の更新作業としては

“`ruby:app/views/users/_follow.html.erb
<%= form_for(current_user.active_relationships.build, remote: true) do |f| %>

<%= hidden_field_tag :followed_id, @user.id %>

<%= f.submit "Follow", class: "btn btn-primary" %>
<% end %>
“`
上記のコードのように、form_forメソッドの引数にremote: trueのハッシュを与えるだけでよい。こうすることでRailsは自動的にAjaxを使うようになる。(*なお、上記の_follow.html.erbファイルはフォロー用のパーシャルであり、form_forを使ってRe

元記事を表示

buildとcreateの違い

# buildとcreateの違い

– 記録する範囲が異なる
– build()メソッドはインスタンスをメモリ上にのみ記録する
– create()メソッドはテストデータベース上にも保存して、データを永続化させる

### 使い分け

– DBに書き込むのは時間がかかるので、DBに保存する必要がないときはbuildを使う
– 属性のチェックだけの場合もbuildで済む

参考記事:http://tkymtk.hatenablog.com/entry/2013/12/15/214420

元記事を表示

Rails5:deviseのOmuniAuthを使った時のエラー「ActionDispatch::Cookies::CookieOverflow」の解決

#環境
Rails5
devise4.7.1
oauth 0.5.4
omniauth 1.9.0
omniauth-oauth 1.1.0
omniauth-twitter 1.4.0
※oauth系のgemを適当に突っ込みまくってるのは無視してください。
#問題
deviseのomniauthを使用して、ログインを試みると、
**ActionDispatch::Cookies::CookieOverflow**

というエラーがでる。
#原因
[StackOverFlow](https://stackoverflow.com/questions/23021371/rails-cookie-overflow-with-omniauth-twitter-sign-up)

>omn​​iauthが提供するハッシュには、twitterから返されるすべてのデータが含まれています。

deviseのsessionがcookieへの保存を行うことがデフォルトになっているが、Oauthを使用した場合の暗号化が死ぬほど長くてエラーがでているとのこと。

#解決フロー
[omniauthの参考記

元記事を表示

Bootstrap導入方法

# 環境

– MacOS Catalina
– Ruby 2.6.3
– Rails 5.2.3

# Bootstrapとは

Twitter社が開発したレスポンシブデザイン対応のCSSのフレームワークで、
簡単にお洒落なフォームやボタンなどを実装する事ができる。

# 【1】 gemをインストールする

“`ruby:Gemfile
gem ‘bootstrap’
“`

Gemfileに`gem ‘bootstrap’`を追加してbundle installする。

“`text
$ bundle
“`

# 【2】 SCSSファイルを作成する

“`text
$ rm app/assets/stylesheets/application.css
“`

を実行しCSSファイルを削除、
その後同じディレクトリにSCSSファイルを作成する。

“`text
$ touch app/assets/stylesheets/application.scss
“`

SCSSファイルを作成したら下記を記述しBootstrapを読み込む。

“`scss:appli

元記事を表示

mac Rails6 で 「syntax error , unexpected tIDENTIFIER, expecting keyword_end render」が出た話

# 目的

– Rails6を使用してサービスを作成中にコントローラファイルを編集しsyntax errorが出た時の解決談を書く。

# エラー概要

– `render (“users/new”)`でsyntax errorが出ている。
– 簡単なrenderの処理を追加しただけでエラーが出たためテンパった。
– 時間をかけたが全く悪い箇所が見つからずにさらに焦った。
– エラーを日本語翻訳しても該当の行に悪い部分は見当たらなかった。→時間かかってどんどん焦っていった。
– 下記のコードをコントローラファイルに記載後、ブラウザで該当ページを確認するとsyntax errorが表示されていた。

“`ruby
# 問題のコード
def create
@user = User.new(name: params[:name], email: params[:email])
if @user.save
flash[:notice] = “登録完了”
redirect_to(“/users/#{@user.id}”)
else

元記事を表示

valid?とinvalid?について

# valid?とinvalid?について

Railsは、ActiveRecodeオブジェクトを保存する直前にバリデーションを実行する。また、バリデーションで何らかのエラーがあるとデータベースに保存されない。

valid?メソッドを使ってバリデーションをトリガすることもできる。

valid?を実行するとバリデーションが実行され、オブジェクトにエラーがない場合はtrue、エラーがある場合はfalseを返す。invalid?メソッドはその反対。

“`ruby
class Person < ApplicationRecord validates :name, presence: true end Person.create(name: "John Doe").valid? # => true
Person.create(name: nil).valid? # => false

“`

ActiveRecodeのバリデーションが行われた後は、errors.messagesインスタンスメソッドを使うと発生したエラーにアクセスできる。定義上は、バリデーション実行後にコレクショ

元記事を表示

mac で コマンド$ rails server を実行した時にエラーが出た話2

# 目的

– サーバをスタートするコマンド$ rails serverを実行した時のエラー解決法を知る。
– 今回の解決方が本当に妥当なものなのか不明なためあくまで筆者の体験談としてまとめる。

# エラー内容

“`terminal
$ rails s
=> Booting Puma
=> Rails 6.0.0 application starting in development
=> Run `rails server –help` for more startup options
error Couldn’t find an integrity file
error Found 1 errors.

元記事を表示

socket の位置について

一日かけてmysql socketの問題に当たり続けたので備忘録として書きます(rails初学者用)
間違っていたらご指摘を本当にお願いします。
# development環境 socketの標準場所
“`
/tmp/mysql.socket
“`
# production環境 socketの標準場所
“`
/var/lib/mysql/mysql.sock
“`
# 確認方法は以下コマンドから(各環境にて)

“`
$ mysql -u root -p
(mysqlのパスワード要)
mysql> show variables like ‘%sock%’;
“`

上記ソケットを通してmysqlにアクセスしてます。
sockファイルは自動生成されるので、自分で作る必要はありません。

“`
Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock'(2)
Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysq

元記事を表示

【AWS】自動デプロイエラー

プログラミング初心者です。
AWSを利用したデプロイに挑戦しています。

“`
$ bundle exec cap production deploy
“`

を実行したところ

“`
# terminated with exception (report_on_exception is true):
Traceback (most recent call last):
1: from /Users/xxxxxx/xxxxxx/xxxxxx/vendor/bundle/ruby/2.5.0/gems/sshkit-1.20.0/lib/sshkit/runners/parallel.rb:11:in `block (2 levels) in execute’
/Users/xxxxxx/xxxxxx/xxxx

元記事を表示

rails 発展その4 アソシエーション

モデルを跨いだデータの呼び出しができるようになります。

ユーザー情報と商品情報などは別テーブルで保存されてることがあり
簡単なコードで呼び出せるようにするコードのこと

“`ruby:app/models/user.rb
class User < ApplicationRecord has_many :items end # ユーザーにたいし複数のアイテムがある時などは has_manyで定義 ``` ```ruby:app/models/item.rb class Item < ApplicationRecord belongs_to :user end # こちらは逆にアイテムにたいしユーザーは一人だけなのでbelongs_toと定義 ``` htmlやコントローラーでの使用の場合は ```ruby:controller def show @items = current_user.items #これでユーザーからアイテムの情報を全て持ってきます。 @item = current_u

元記事を表示

bundle install時のエラー

ディレクトリ作成後bundle insatallをするとエラーが出た。

$ bundel insatall
~
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
~
An error occurred while installing mysql2 (0.4.10), and Bundler cannot continue.
Make sure that `gem install mysql2 -v ‘0.4.10’ –source ‘https://rubygems.org/’` succeeds before bundling.

対処法を検索

$ bundle config –local build.mysql2 “–with-ldflags=-L/usr/local/opt/openssl/lib”

と叩いて

You are re

元記事を表示

神記事まとめ

神記事の備忘録

## Git
[【永久保存版】Gitのあらゆるトラブルが解決する神ノウハウ集を翻訳した](https://blog.labot.jp/entry/2019/07/01/183204)

## フロントエンド
[【保存版】Webフロントエンド基礎力(初心者向け)](https://qiita.com/teradonburi/items/43c52d7cffc318e9b1e9)

## Ruby
[[初心者向け] RubyやRailsでリファクタリングに使えそうなイディオムとか便利メソッドとか](https://qiita.com/jnchito/items/dedb3b889ab226933ccf)

## Rails
[【初心者向け】丁寧すぎるRails『アソシエーション』チュートリアル【幾ら何でも】【完璧にわかる】](https://qiita.com/kazukimatsumoto/items/14bdff681ec5ddac26d1)

元記事を表示

rails 発展その3 マイページの作成と部分テンプレート

## マイページの作成
基本は:idの使用くらいで他と変わらず
userコントローラーの作成とshowアクションでビューを作成するくらいです。

“`ruby:routes
Rails.application.routes.draw do
get ‘/コントローラ名/:id’ => ‘コントローラ名#show’
end

# :idの部分には表示するユーザーページのユーザーのidが入ります。

# 例
Rails.application.routes.draw do
get ‘users/:id’ => ‘users#show’
end
# mypageのルーティング
“`

“`bash:ターミナル
$ rails g controller users
“`

“`ruby:app/users/users_controller.rb
# ここも基本欲しいデータ(名前と持っているアイテム一覧)を引っ張ってくる仕様です。
# 又 current_user.カラム名 とすることでログインしてるユーザ

元記事を表示

Rails アソシエーション関連のエラー(ActiveRecord::HasManyThroughOrderError)

#該当のエラー
ActiveRecord::HasManyThroughOrderError

Cannot have a has_many :through association ‘Group#employees’ which goes through ‘Group#group_employees’ before the through association is defined.

#実現したいこと 
社員は複数のグループに所属できて、
グループは複数の社員を持っているという風に結びつけたい。
グループに所属している社員。つまり@group.employeesを
実現したい。

#原因

エラーメッセージにある通り
HasManyThroughOrderError
文字通りの順番(Order)が原因らしい

“`rb:Groupモデル
class Group < ApplicationRecord has_many :group_employees has_many :employees, through: :group_employees end ```

元記事を表示

Rails 6のassetsにjQueryとBootstrapを入れる

Rails 6でもassetsにjQueryとBootstrapを入れて、どこからでも使えるようにしたい。

– assetsのほうが設定が楽。
– 開発時のコンパイルが速いような気がする。

GemfileにRails 6で削除されたgemとBootstrapのgemを入れます。

“`ruby:Gemfile
gem ‘sassc’, ‘~> 2.0.0’
gem ‘uglifier’
gem ‘jquery-rails’
gem ‘bootstrap’
“`

sasscにバージョンを指定しているのは、最新版だとライブラリのロードエラーが出たからです(ここはあとで調べ直します)。

assetsの下にjavascriptsディレクトリを作り、application.jsを新規作成して、jQueryとBootstrapのJavaScriptを入れます(これ以外のJavaScriptはapp/javascriptのほうに置くなら、`require_tree`の行は要りません)。

“`javascript:app/assets/javascripts/application.j

元記事を表示

#Rails マイグレーションで on_delete: :nullify を指定して、 DB に ON DELETE SET NULL の外部キー制約を追加する

# 例

“`rb
class CreateBook < ActiveRecord::Migration[5.2] def change create_table :book do |t| t.references :user, foreign_key: { on_delete: :nullify } end # あとから追加する場合は多分こう # add_foreign_key "books", "users", on_update: :nullify end end ``` # ON DELETE SET NULL とは - 親のレコード = user が削除された時に、子が持っている親のID = user_id が null に更新される - 親のレコード = user が削除された時に、子のレコード = book は削除されない # 参考 [外部キー制約について - Qiita](https://qiita.com/SLEAZOIDS/items/d6fb9c2d131c3fdd1387) # Origina

元記事を表示

rails 発展その3 ログイン機能のリンクについて

## ログインの有無-user_signed_in?
deviseの実装で使えるようになるメソッドでこれでログインしてるかしてないか
処理を分けることができます。

“`html:index.html.erb
<% if user_signed_in? %>

<%= link_to "ログアウト", destroy_user_session_path, method: :delete %>
投稿する

<% else %>
     

<%= link_to "ログイン", new_user_session_path, class: 'post' %>
<%= li

元記事を表示

LINE Messaging API・LINE Botを使ったKPT分析に特化したWEBアプリ(Rails)を作る

# TL;DR
この記事は、LINE ログインとLINE BotによりWebアプリと連携を行うことを目的としています。

このアプリはスクラム開発を行っている方が対象となっています。
主な機能として、スプリントごとにKPTを管理できたり、タスクの管理が行えます。
ログインはLINEアカウントにより可能です。

実際に作成したWebアプリはこちらになります。
ぜひ、使ってみてください!
[KPT分析・タスク管理アプリ DONE](https://tmrekk121-done.herokuapp.com)

# アプリ概要
![linebot-flow.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366133/c6a6a08e-1fdc-400e-98b4-ef5c8da20aa6.jpeg)

LINEBotは用途として現在はタスクを取得・登録することのみ可能です。

# 環境
– Ruby version 2.6.0
– Rails version 6.0.0
– MySQL 8.0.17

# 実

元記事を表示

Rails チュートリアル 9章 独学学習メモ

こちらは『[Railsチュートリアル](https://railstutorial.jp/chapters/beginning?version=5.1#sec-introduction)』の独学学習のメモになります。

環境について
– Macを使用
– cloud9を利用

#第9章

9章では、ユーザーの任意の設定で、ブラウザを落としても、ユーザーがログアウトしない限り、ログインしたままの状態を作っていきます。

##9.1 Remember me 機能

ブラウザを落としても、ログインが有効となる機能を実装します。

トピックブランチを作成していきます。

“`
$ git checkout -b advanced-login
“`

##9.1.1 記憶トークンと暗号化

sessionメソッドは、ブラウザを落としたらユーザーIDが消えてしまいます。

しかし、記憶トークンを作成し、cookiesメソッドを使うことで、永続的にcookiesの作成やrememberdigestによるトークン認証で、この記憶トークンを使います。

sessionメソッドと違いcookiesメ

元記事を表示

rubocopの起動をチョッパヤにする

## 概要

rubocop でコードのチェックをしているが、検査が始まるまでにどえらい時間がかかるのでなんとかしたい

## 原因

ファイルのリストアップに時間がかかっているっぽい。
プロジェクトのファイル数に比例してロード時間が伸びる。

## 解決策

Exclude に除外するディレクトリを登録
gemとかJSのライブラリのディレクトリを除外する

“`ruby
AllCops:
Exclude:
– ‘.direnv/**/*’
– ‘.git/**/*’
– ‘bin/*’
– ‘db/schema.rb’
– ‘config/**/*’
– ‘lib/tasks/**/*’
– ‘log/**/*’
– ‘node_modules/**/*’
– ‘public/**/*’
– ‘tmp/**/*’
– ‘vendor/**/*’
“`

## 結果

before

“`shell
$ rubocop 0.18s user 0.09s system 1% cpu 13.

元記事を表示

OTHERカテゴリの最新記事