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

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

Rails+Vue.jsによるフォームの作例

私の体感では、Railsアプリケーションで開発にかかる時間の半分はテンプレートとJavaScriptで、その大半はフォームです。ややこしいテンプレートはRails側で頑張らずに、Vue.jsのようなJavaScriptのフレームワークに投げてしまう、という作り方を今後のスタイルとしたい。

このサンプルは、ここ1年半ほどRails上でVue.jsをいじくって考えた、現在のところのベターなパターンです。まだ研究中なところもあり、今後変更する可能性もあります。

サンプルプログラムはこちら。簡単なブログアプリケーションです。
https://github.com/kazubon/blog-rails6-vuejs

## 環境

– Rails 5.2/6.0、Webpacker 4、Vue.js 2.6。
– 非SPA、Turbolinksあり。
– jQueryとBootstrapあり。

そこそこ大きな業務アプリケーションを想定(サンプルはブログですが)。Vue.jsではないJavaScriptを使っているなど、いろいろなスタイルのページが混じっているものとする。

## ポイント

元記事を表示

削除がうまくいかずエラーが出る。。。

#ツイートを削除しようとしたら、こんなエラーが出た。

###`ActiveRecord::StatementInvalid in TweetsController#destroy`

###`Mysql2::Error: Cannot delete or update a parent row: a foreign key constraint fails`

![ダウンロード (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529651/dd687747-ab75-1bfc-90cb-2c93a909ed4c.png)

僕はただツイートを削除したいだけなのに。。。

#なぜエラーがでたのか

####【結論】
`tweetsテーブル`と`commentsテーブル`で外部キー制約を結んでいたため。

【commentsテーブル】
21b53daebb42568420a0e4d42c965cf9.png削除ボタンを押したら、確認ダイアログを出そう。

#`data: { confirm: “削除しますか?” }`を追記

“`ruby:xxx.html.haml
= link_to “削除”, path, method: :delete, data: { confirm: “削除しますか?” }
“`

最後に加えればOK!
めっちゃ簡単に確認ダイアログが作成できた!嬉しい!!

ではまた!

元記事を表示

redirect_backで直前のページにバック!

現在ツイート詳細ページ(show.html.haml)でコメントができます。
![alt](https://gyazo.com/f989bfdb4eb8bbfc22f29d03612d2cc3.gif)

ツイートにコメントをしたらコメントする前の状態に戻るようにします。
`redirect_back(fallback_location: アクション名)`で直前のページに戻すことができます。

“`ruby:app/controllers/comments_controller.rb
def create
tweet = Tweet.find(params[:tweet_id])
@comment = tweet.comments.build(comment_params)
if @comment.save
redirect_back(fallback_location: tweet_path(tweet))
else
flash[:danger] = “テキストを入力してください”
redirect_back(fallback_locatio

元記事を表示

ログイン中ユーザーの投稿内容をshowアクション以外で出力する方法

SNSっぽいアプリケーションのマイページで、ログイン中ユーザの投稿一覧を取得したかっただけなのにかなり詰まったので備忘録として残しておきます。

アプリの仕様上showアクションやshow.html.erbファイルを使用できず、index.html.erbで表示させるというレア?パターンではありますが。
#環境
Rails 5.2.3
Ruby 2.5.1
gemのdeviseを使用
当記事で使用しているモデル名はplace
#詰まった所
homes/index.html.erbファイル内にてeach doを利用し投稿内容を全部出力したい。

“`homes/index.html.erb
<% @myplaces.each do |myplace| %>
#省略
<% end %>
“`

全部のplaceを取得するのはhomesコントローラー内のindexアクションで

“`:./controllers/homes_controller
@places = Place.all
“`
こう書けばいい。そりゃそうだ。
問題はログイン中ユーザの投稿内容だけを取得したい時。

元記事を表示

【Rails】 bundle install エラー「Errno::EACCES: Permission denied @ rb_sysopen -」の権限視点からの対応策 (mysql2)

備忘録です。
自身の記事ですが[【Rails環境構築】MySQL2が原因で「bundle install」失敗した時の対処法](https://qiita.com/4EAE_Learner/items/110f7e025b1d842d4bee)のようなPATHの変更でも解決できない状況に陥ったため。

#環境
OS       : Mac OS Catalina 10.15.1
Ruby      : v 2.6.3p62
Rails      : v 6.0.1
Homebrew  : v 2.1.16
Bundle    : v 1.17.2
MySQL    : v 8.0.18 for osx10.15 on x86_64 (Homebrew)

その他
※ username は個人の作業ユーザ名になります。

“`
$ whoami
=> username
“`

#エラー

“`
$ bundle install
The dependency tzinfo-data (>= 0)

元記事を表示

Rails Tutorial Memo #5

自分用の備忘録です.

# 第10章 ユーザーの更新・表示・削除

## この章で学べること
– これまで未実装だったedit,update,index,destroyアクションを加え,RESTアクションを完成させる.
– ユーザーが自分のプロフィールを自分で更新できるようにする.
– すべてのユーザーを一覧できるようにする.
– ユーザーを削除し,データベースから完全に消去する機能を追加する.

## 10.1 ユーザーを更新する
ユーザー情報を編集するパターンは新規ユーザーの作成と極めて似通っている.
`new`アクションと同じように`edit`アクションを作成し,POST リクエストに応答する`create`アクションの代わりに PATCH リクエストに応答する`update`アクションを作成する.
ユーザーの登録は誰でも実行できるが,ユーザー情報を更新できるのはそのユーザー自身のみに限られる.

### 10.1.1 編集フォーム
ユーザー編集ページの正しい URL は`/users/1/edit`であるため,ユーザーの id は`params[:id]`で取り出すことができる

元記事を表示

Capybaraで壊れにくいテストを書くために気を付けていること

この記事は[SmartHR Advent Calendar 2019](https://qiita.com/advent-calendar/2019/smarthr) 2日目の記事です。

SmartHRではRuby on Railsを広く採用しています。アプリケーションを長期的にメンテナンスしていくためにテストは欠かせません。特にReact.jsなどを用いた複雑なUIにおいては、単なるAPIのテストやモデルのテストだけではなく「実際にブラウザを操作して、ユーザーが期待する結果を得られるかどうか」をテストすることが重要です。

Rubyではこのようなブラウザを操作するテストを書くために、[Capybara](https://github.com/teamcapybara/capybara)という便利なフレームワークがあり、比較的簡単にテストを書き始めることができます。ただ、この手のテストは保守が大変であったり、手間の大きさからテストが追加されなくなったり、ということがよくあります。本記事では、私がこれまでの経験から学んだ、壊れにくいテストを書くためのTipsを紹介します。

なお、特に

元記事を表示

【Rails】ユーザーの削除と権限【Rails Tutorial 10章まとめ】

##管理ユーザー
###admin属性
ユーザーを削除する機能を追加するが、この機能は特別な権限を持ったユーザーのみが行えるようにする。
まずはUserモデルにadmin属性を追加する。

“`console
$ rails generate migration add_admin_to_users admin:boolean
“`
マイグレーションファイルのadd_columnにdefault: falseオプションを与えて、admin属性のデフォルト値をfalseにする。

“`db/migrate/[timestamp]_add_admin_to_users.rb
class AddAdminToUsers < ActiveRecord::Migration[5.0] def change add_column :users, :admin, :boolean, default: false end end ``` サンプルユーザーの一人のadmin属性値をtrueにする。 ```db/seeds.rb User.create!(name: "Exam

元記事を表示

rails独学でポートフォリオを作成中

こんにちは!現在転職活動中のバスケンです。
初めての投稿です!

railsの独学を初めて3か月が経ちました。
この3か月間の私の学習経過は下記になります。

**1、progateでhtml,css,ruby,ruby on rails,githubを1周**
**2、ruby on rails チュートリアル2週**
**3、railsでオリジナルのポートフォリオを作成途中**

今日は**3**にて私が作成したポートフォリオの**概要**を説明します。

ポートフォリオ「KuiShare」の概要

私は人の**後悔**を聞いたとき似たような**後悔**が自分に起きないように気をつけるよにします。

このことから、みんなとたくさんの**後悔**が共有できればおのずと注意深くなり先々で自分に起きうる**後悔**を減らすことができるのではないかと考えました。

みんなと気軽に後悔を共有することができるのが今回作成した**「KuiShare」**です。

「KuiShare」のURL「https://kuishare.herokuapp.com/」

**「KuiSha

元記事を表示

【Rails】ユーザー一覧の表示とページネーション【Rails Tutorial 10章まとめ】

##ユーザー一覧ページ
###indexアクションの認可
ユーザー一覧を表示するindexアクションとビューはログインユーザーにのみ表示したいので、logged_in_userを設定する。

“`app/controllers/users_controller.rb
class UsersController < ApplicationController before_action :logged_in_user, only: [:index, :edit, :update] before_action :correct_user, only: [:edit, :update] def index @users = User.all end . . . end ``` indexアクションには@users変数に全てのUserオブジェクトを入れておく。 テストを書く。 ```test/controllers/users_controller_test.rb test "should redirect index when not lo

元記事を表示

railsの`ActiveSupport::Callbacks`の各コールバックの実行順序

# railsの`ActiveSupport::Callbacks`の各コールバックの実行順序

## 結論

`before_*`, `around_*`はキューに積まれた新しい順番に、
`after_*`は積まれた順番の古い順に処理される

> Calls the before and around callbacks in the order they were set, yields
> the block (if given one), and then runs the after callbacks in reverse
> order.

See: https://github.com/rails/rails/blob/master/activesupport/lib/active_support/callbacks.rb#L76-L78

## 実装
### キューを処理する処理
まずコールバックの実行自体は`ActiveSupport::Callbacks#run_callbacks`(https://github.com/rails/rails/blob/mast

元記事を表示

Rails × CircleCI × ECSのインフラ構築

簡単なDocker RailsアプリをECSを利用して本番環境に上げるまでのまとめ

* あくまで参考に(実務でそのまま利用できるほどしっかり構築しておりません)

![image.png](https://cacoo.com/diagrams/nEYNTgyozWzsHKqQ-7F3E1.png)

# 前提知識
ECSとは?クラスターとは?サービスとは?タスクとは?って人は
[ECSの概念を理解しよう](http://www.mpon.me/entry/2017/11/19/200000)
などを読んでください。

# Railsアプリ作成
まずはローカルでRailsアプリを作成しましょう。
機能は簡単なものでいいので、scaffoldなどを利用してサクッと作成してしまいましょう。
脳死で作成したい人は下記をご覧下さい。
[Docker Rails Sampleアプリ構築 \- Qiita](https://qiita.com/key_sn/items/6a04dd9a03012a691119)

# AWS上で利用するリソースの作成
コンソール上(or Terraformなど)

元記事を表示

mergeメソッド

###mergeメソッド

二つのハッシュを結合する

結合前

~~~
def create
Tweet.create(image: tweets_params[:image], text: tweets_params[:text], user_id: current_user.id)
end
~~~

結合後

~~~
def create
Tweet.create(tweets_params)
end
~~~

元記事を表示

Docker Rails Sampleアプリ構築

適当なRailsアプリを作成するのに**脳死で作成**する

### 前提
* Ruby 2.6.5
* Railsバージョン6.0.1
* MySQL 5.7
* Node.js 8系
* webpacker用のコンテナは用意していない

“`
$ mkdir rails-sample

$ rbenv local [使用するrubyバージョン]

$ git init

$ bundle init
gem ‘rails’のコメントアウトを外す

$ bundle install –path vendor/bundle

$ bundle exec rails new . -B -d mysql –skip-test
-B bundle install をスキップする(お好み)
-d 利用するDBを指定(デフォルトはSQLite)
–skip-test railsのデフォルトのminitestというテストを利用しない場合は指定(お好み)

Gemfileの上書きしていいかどうかは Y でEnter

$ bundle exec rails webpacker:install

元記事を表示

【Rails】フレンドリーフォワーディング【Rails Tutorial 10章まとめ】

認可機能によって、ログインしていないユーザーが編集ページにアクセスしようとすると、ログインページにリダイレクトされる。
その後ログインするとプロフィールページに移動するが、ここでもともとアクセスしようとしていた編集ページに移動してくれると親切である。
これをフレンドリーフォワーディングと呼ぶ。

##フレンドリーフォワーディングのテスト
フレンドリーフォワーディングは少し複雑なので、テスト駆動開発で進める。
編集成功時のテストを修正する。

“`test/integration/users_edit_test.rb
test “successful edit with friendly forwarding” do
get edit_user_path(@user)
log_in_as(@user)
assert_redirected_to edit_user_url(@user)
name = “Foo Bar”
email = “foo@bar.com”
patch user_path(@user), params: { us

元記事を表示

Rails と React+TypeScript でのGraphQLスキーマ運用プラクティス

Linc’well Advent Calendar3日目の記事です。

当社が展開するクリニックグループである [_CLINIC FOR_ の予約システム](https://reservation.clinicfor.life/) では一部機能にGraphQLを導入しているのですが、スキーマの管理等も踏まえてどのように構築し、運用したかについて紹介したいと思います。

**※ ちなみに構築したのは2019/3~4頃であり、その点は割り引いてご覧ください :pray_tone2:
今だともっと良さげなプラクティスがあるかもしれません。**

また、予約システム全体としてはモノリシックなRailsアプリケーションになっているのですが、GraphQLを導入した一部機能ではフロントエンドがTypeScript+Reactで構築されており、ruby側で定義されたスキーマ情報はTSの型定義へスムーズに繋げる必要がありました。

## スキーマファイルの生成

GraphQLには様々な実装があるかと思いますが、今回[`rmosolgo/graphql-ruby`](https://github.c

元記事を表示

【Ruby | Rails】Dockerfileの中で”ADD Gemfile ~ RUN bundle install”をするのはやめませんかという話

# 今回の検証環境

– Ruby `2.6.5`
– Docker `19.03.5`
– Docker-Compose `1.24.1`

# はじめに

– Railsの設定を例にすると結構複雑になっちゃうので、今回は単純にRubyをDocker上で使用する例で解説します。
Railsを使用する場合も要点は同じなので適宜読み替えてください。
– 今回は`hogehoge`ディレクトリ配下で作業します。サンプルコード中の`hogehoge`の部分は自由に変更して構いません。

# やめませんか

RailsやRubyのDocker環境構築の解説をしている記事で、`Dockerfile`内で以下のように`ADD Gemfile`~`RUN bundle install`している記事を本当にたくさんよく見かけます。

“`dockerfile:Dockerfile
FROM ruby:2.6.5

WORKDIR /hogehoge

RUN gem install bundler

# ↓こういうの↓
ADD Gemfile Gemfile
ADD Gemfile.lock G

元記事を表示

Railsでmodelに動的なカウンターをつける

### 要約
railsで一覧画面に何かしらの集計値とかフラグを表示したいときがあると思います。
いいね数とかそういうの。
それをcounter_cacheとかでデータとして持たずに、動的に集計してきれいに組み込む方法です。

### やり方
“`ruby
class Post < ApplicationRecord has_many :likes, as: :likable end class Like < ApplicationRecord belongs_to :likable, polymorphic: true end @posts = Post.all.select("posts.*, (select count(*) from likes l where l.likable_type='Post' and l.likable_id=posts.id) as likes_count") @posts.first.likes_count # as xxxがattributeになる => 3
“`

サブクエリ`(select count(*) from li

元記事を表示

[Rails] CircleCIでRspecを回すと「Please call Stripe() with your publishable key. You used an empty string.」というエラーが出る

## 問題

注文画面から「決済方法を選択する」をクリックし、決済方法選択画面に各種支払方法(クレカ、PayPal、銀行振込)が
表示されているかを確認するためfeature specを作成しました。

ローカルでパスしたのでCIで確認したところ、このようなエラーがでました。

“`
Capybara::Webkit::JavaScriptError:
{:line_number=>1, :message=>”IntegrationError: Please call Stripe() with your publishable key.
You used an empty string.”, :source=>”https://js.stripe.com/v3/”}
“`

## エラーをみてみる
`Please call Stripe() with your publishable key.
You used an empty string.”`

どうやらStripe()という関数?をpublishable keyと一緒に呼ばなければならないようです。

そもそもStri

元記事を表示

OTHERカテゴリの最新記事