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

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

Rails Tutorial 第11章 演習11.3.3.3 どんなテストをすべきか人によって違う

##演習11.3.3.3 
かなり苦労しました。
どんなテストをすべきかが問題には

>ここまでの演習課題で変更したコードをテストするために、/users と /users/:id の両方に対する統合テストを作成してみましょう。
有効でないユーザーは表示する意味がありません

と詳細化されていないため、自分も含めネットの方の解答例がバラバラでした。

テストは2つと考えました。
1つ目は
>/usersのユーザーindexページを開くとすべてのユーザーが表示され、

2つ目は

>/users/:idのようにIDを指定すると個別のユーザーを表示できます。

です。

1つ目のテストは、既にあるindexページのテストを修正します。
検証項目は、indexの結果にacrivatedでないユーザーは表示されないことです。

準備として、テストデータにactivatedがfalseのユーザーを作ります。
users.ymlに既にあったlanaを修正します。

“`yml:test/fixtures/users.yml
lana:
name: Lana Kane
 ..
act

元記事を表示

Rails Tutorial 第11章 @userとuserの違いに気が付かなかった

演習だけでなく、本文のコードを実行するときにもつまずきました。
リスト 11.32でエラーになり、自分のコードと本文のコードで@userとuser
が違っています。
過去の演習9.3.1.1で変更した点が、11章では変更されていないと気が付きました。

演習9.3.1.1
sessions_controller.rb のcreateの中で変更しています。
変更前 user
変更後 @user

11章のリスト 11.32では
sessions_controller.rb のcreateの中で、
user と変更前に戻っています。

なので自分のコードに11章の変更部分だけを追記するとエラーになることが分かりました。

“`ruby:sessions_controller.rb エラー
if user.activated?
log_in user
params[:session][:remember_me] == ‘1’ ? remember(user) : forget(user)
redirect_back_or user

元記事を表示

Rails Tutorial 第11章 activated?メソッドは自動で作ってくれる

##タイプミスでつまずく アンダースコアとピリオド

11.3で実行したところ、

“`bash
undefined method `user_activated?’ for # Did you mean? user_path
“`

で単純なタイプミス、アンダースコアとピリオドを間違えました。
誤:user_activated?
正:user.activated?

そのときにactivated?というメソッドをどこで作ったのだろうかとしばらくあちこち探しました。

authenticated?というメソッドは作ったのでどこかで作ったのを忘れているのだろうと思っていました。

その答えは、modelに追加するときにactivatedをbooleanで作ったので、自動的に論地値を返すactivated?メソッドも使えるようになっていました。

チュートリアルの少し前を見返したら11.1.2にちゃんと書いてありました。
>続いて、activated属性を追加して論理値を取るようにします。

元記事を表示

Rails Tutorial 第11章 演習11.3.1.1で「ユーザーを作成」の意味を取り違えました

演習11.3.1.1で
>コンソール内で新しいユーザーを作成してみてください。

の意味を取り違えました。

“`bash
>> a = User.new
=> #
>> a.remember_token
=> nil
>> a.activation_token
=> nil
>> a.activation_digest
=> nil
>> a.remember_digest
=> nil
“`

で次の設問の
>authenticated?メソッドを使って、先ほどの各トークン/ダイジェストの組み合わせで認証が成功することを確認してみましょう。

だと、各値がNilでは意味がないので、前の答えがおかしいと

元記事を表示

Rails Tutorial 第11章 mailerのhostの設定でつまづきました

リスト11.16で

>ホスト名 ‘example.com’ の部分は、各自のdevelopment環境に合わせて変更してください。例えば、筆者はクラウドIDEを使っているので、このような設定になります。

“`ruby:config/environments/development.rb
host = ‘rails-tutorial-mhartl.c9users.io’ # クラウドIDE
“`

に何を入れるのかが分かりませんでした。
クラウドIDEの画面のURL欄は c9users.io では終わらないです。
rails serverコマンドで立ち上げたテストできる画面のURLも同様です。

ネットの他の方が何を入れているのか調べました。書いていない方が多く、見つけられたのは

“`ruby:config/environments/development.rb
host = ‘us-east-2.console.aws.amazon.com’
“`

でした。私のクラウドIDEの画面も同じだったので、これでテストしてみます。

>指定のURLでアカウント有効化メ

元記事を表示

【Rails6】$ rails s でRuntimeError

###概要

環境構築して初のRails sで毎回出るのでメモ
bundleを使ってのrailsの環境構築前提です。

`$ rails s`をすると下記エラーが、、、

“`
$ bundle exec rails s
=> Booting Puma
=> Rails 6.0.3.2 application starting in development
=> Run `rails server –help` for more startup options
Exiting
Traceback (most recent call last)

…..

…..

Webpacker configuration file not found /Users/hoge_app/config/webpacker.yml.
Please run rails webpacker:install
Error: No such file or directory @ rb_sysopen – /Users/hoge_app/config/webpacker.yml (Runtime

元記事を表示

フォロー機能のアソシエーション備忘録(Userモデルの記述を理解する)

## 目次
– [はじめに](#はじめに)

– [多対多なので中間テーブルを作成](#多対多なので中間テーブルを作成)

– [モデルを2つに分けて考える(ここ重要)](#モデルを2つに分けて考えるここ重要)

– [①フォローする側の目線で考える](#フォローする側の目線で考える)

– [②フォローされる側の目線で考える](#フォローされる側の目線で考える)

– [まとめ](#まとめ)

## はじめに
ここ数日間、フォロー機能のアソシエーションを理解するのにもがき苦しんだわけですが、やっと自分の中に落とし込むことができたので備忘録として残します。

個人的に**Userモデルへのアソシエーションの記述**のところで頭がごちゃごちゃになって詰まったので、そこを中心に書いています。ですので今回は、viewやcontrollerの実装に関しては触れていません。

ということで早速始めます。

## 多対多なので中間テーブルを作成

フォロー機能のアソシエーションは、多対多(user対user)のアソシエーションなので、
中間テーブルを用意して「一対多」(user対relation

元記事を表示

【Ruby on Rails】sidekiqの導入手順(ローカル環境とHeroku環境)

# redisを準備する

sidekiqを使う為にredisが必要です。

### redisインストール(Mac OS)
“`
brew install redis
“`

### redis起動
“`
brew services start redis
“`

# アプリケーションにsidekiqを導入する

“`ruby:Gemfile
gem ‘sidekiq’
“`

“`ruby:config/application.rb
config.active_job.queue_adapter = :sidekiq
“`

### sidekiqを起動する
“`
sidekiq -q default -q mailers
“`

もしくは

“`yml:config/sidekiq.yml
:concurrency: 25
:pidfile: ./tmp/pids/sidekiq.pid
:logfile: ./log/sidekiq.log
:queues:
– default
– mailers
:daemon: true
“`

“`
si

元記事を表示

ransack でカラム同士を比較する

# まとめ

下記の ransacker とパラメータの組み合わせで `(model.column_A <= model.column_B) = TRUE` が条件に追加されます。同じテーブルのカラム同士の比較を条件に加えることができます。 ```ruby:モデルに書くransacker ransacker "compare", args: %i[parent ransacker_args] do |parent, args| columns = args.values Arel::Nodes::Grouping.new( Arel::Nodes::InfixOperation.new( '<=', parent.table[columns[0].to_sym], parent.table[columns[1].to_sym] ) ) end ``` ```ruby:パラメータ 'q' => {
‘c’ => {
‘0’ => {
‘a’ => {‘0’ => {‘name’ =>

元記事を表示

foreign_keyを設定しているカラムのカラム名を変更したときにはまったこと。

### 困っていたこと
先日、foreign_keyを設定していたカラムのカラム名を変更したときに、エラーにはまってしまったので、備忘も兼ね記事に残しておこうと思います。

なお、実行環境は下記のとおりです。

– Rails 5.2.4.2
– PostgreSQL 12.2

### 前提条件
従業員の活動を記録するデータベースにおいて、従業員(employees) は 活動(activities)と多対多の関係にあります。下記のようなUIで一気に活動に参加した従業員を記録したく、

![ui.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393888/73a08f43-114b-a43c-8d99-c03bd1a6a1a4.png)

以下のコードを書きました。

### 作成したコード
**Model**
activitiesとemployeesで多対多の関係を定義し、中間テーブルを`activity_employees`としています。

“`Ruby:models/employee.rb
c

元記事を表示

【Rails】ハッシュや配列に特定要素が存在するか判別 [ActiveRecord] [has_attribute?]

ハッシュや配列の中に特定の要素が存在するか確認する方法です。
emailが登録されていなかったら登録、されていたらメッセージ、みたいなイメージです。

##任意のハッシュを判別

このようなハッシュを例にします。
`nil` `empty` に注目です。

“`ruby
@user = {
“id” => 1,
“name” => “Taro”,
“age” => 26,
“from” => nil,
“sex” => “”,
“created_at” => Sun, 21 Aug 2020 09:55:05,
“updated_at” => Sun, 21 Aug 2020 09:55:05
}
“`

##has_attribute?で判別

特定の要素自体があるかどうか判別します。
`has_attribute?`でこのような結果が得られます。

“`ruby
@user.has_attribute?(:name) # => true
@user.has_attribute?(:from) # => true
@user.has_attribute?(:sex

元記事を表示

Railsで日本語をurlに使いたい時の書き方備忘録

## この記事で書くこと
– `/animals/隣の猫さん` `/animals/山奥の熊さん`
のようなurlを実現させるために何をする必要があるのか。

何も対処しないと、以下のような`animals#show`にリクエストすると `URI::InvalidURIError` が発生してしまう。 :disappointed:

“`rb:animals_controller.rb
class AnimalsController < ApplicationController def show @animal = Animal.find_by(name: params[:name]) end end ``` ## 結論 ### Controller 以下のようにutf-8にエンコードしてあげれば良い. ```rb:animals_controller.rb class AnimalsController < ApplicationController before_action :encode_with_utf_8, only: :show

元記事を表示

assign_attributes で中間テーブルが保存されてしまう

– 入力フォームから値を受け取り、バリデーションを行ってから保存したい、みたいな時に一旦インスタンスの変数を更新するために `assign_attributes` を利用したら思わぬ結果になった
– rails の中間テーブルにおいては、`assign_attributes` 実行時にDBインサートが走り、コミットまでされてしまう
– そのため、modelのバリデーションエラーで保存に失敗した際に、中間テーブルが保存されっぱなしの状態になってしまった
– 以下のように理解していたが、これは正確ではなさそう
– `update_attributes` はインスタンス変数の更新を行い、DBの更新まで行う
– `assign_attributes` はインスタンス変数の更新を行うが、DBの更新は行わない
– つまり、`assign_attributes` してからバリデーションにかかったり、何らかの理由で保存されたくない時は明示的にロールバックするか、先にインサートしないという工夫が必要になる

# ユースケース
– 以下のようなユースケースを

元記事を表示

Invalid route name, already in use: ‘new_user_session’のエラー解決方法

## 環境
Mac OS Catalina
Ruby 2.7.1
Rails 6.0.3.2

## 現象
ログイン機能用にdeviseを導入しrouteを設定。
その後、Rails routesを実行すると下記のエラーが出た。

“`
Invalid route name, already in use: ‘new_user_session’ (ArgumentError)
You may have defined two routes with the same name using the `:as` option, or you may be overriding a route already defined by a resource with the same naming. For the latter, you can restrict the routes created with `resources` as explained here:
https://guides.rubyonrails.org/routing.html#restricting-th

元記事を表示

Railsのテンプレート機能(ERB)をController(Action View)以外で使う

# 概要

Railsは、テンプレートをアクションで紐付けてくれるので便利ですよね。
Action ViewとERB (Embedded Ruby)ってやつです。
たまに、そのテンプレートを、他の箇所で使いたいことがあります。
調べましたがあまり情報が出てこなかったり、見つけたと思ったら動かなかったりしたので解決した方法を備忘として投稿します。

# 動作環境
ruby 2.6.5
rails 5.2.3

# サンプル

例えばJobとかで利用。

app/views下(任意の場所可)にtemplateを作成。

“`ERB:sample.html.erb
<%= user_name %>さんへ

これはサンプルです。

“`

次にJob。

“`ruby:send_template_job.rb
class SendTemplateJob < ApplicationJob queue_as :default def perform(*args) # テンプレートを使う content = ActionView::Base.new('app/view

元記事を表示

localhostで(google_oauth2) Authentication failure! csrf_detected: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF detectedって言われた時の対応

# 結論
今回はlocalhostで試していたので、config/devise/session_store.rbを下記のように変更すればOK。

“`
if Rails.env.production?
Rails.application.config.session_store :cookie_store, key: ‘_my_session’, expire_after: 1.weeks, domain: ‘mydomain.com’
else
Rails.application.config.session_store :cookie_store, key: ‘_my_session’, domain: ‘localhost’
end
“`

# 原因など
Ruby On Railsのdeviseは本当に優秀であっという間にFacebookのログインは出来るようになったのですが、どうもlocalhostで試した時に「Google OAuthの挙動がおかしいような?」となり調べました。

どうもエラーでググると「provider_ignores_state: true

元記事を表示

Ruby on Railsのflashの使い方をまとめてみた

#プログラミングの勉強日記
2020年8月14日 Progate Lv.226

#flashとは
 ページ上に一度だけ表示されるメッセージのこと。ユーザに対してページを移動したときに簡単なメッセージを表示させることができる。ユーザの登録完了などのサクセスメッセージや、投稿などの操作が失敗したときのエラーメッセージなどを表示するときに使う。

![0814.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/45077326-805b-ea33-7522-7672f774c63c.png)

#flashの書き方
 flashはハッシュのような形で記述する。

“`:コントローラ
flash[:キー名]=”表示したいメッセージ”
“`
 キー名は好きな名前を付けることができる。
 フラッシュメッセージを表示したい箇所には以下のように記述する。

“`:ビューファイル
<%= flash[:キー名] %>
“`

##scaffoldで自動的に作成した場合

“`ruby:posts_

元記事を表示

リクエストパラメーターとその型について

最近のAPIの開発に着手し始めて、クライアントから送られてくるリクエストパラメーターの型について意識し始めた。クエリストリングやボディーのフォーマットに応じてどのような型がくるのか整理したく記録に残す。

###クエリストリングで送られてくる場合

“`
localhost:3000/shops?pageno=1&pagesize=60
“`

キーに値が指定していればその値の型は`文字列`となる。

*ちなみに`key=value`の記述がない場合は`null`となり、`key=`のみ記述した場合はその値は`空文字列`となる。
*(Railsの場合)paramsで文字列として値がセットされるので、API側で文字列以外の値を使いたいときはその型へキャストする必要がある。

###ボディーで送られてくる場合

####ボディーのフォーマットが`Content-Type: application/x-www-form-urlencoded`の場合

WEBブラウザのフォームのリクエストでよく使われる。
キーに指定した値はRFC1866が定める変換フォーマットにしたがって`文字列`に変

元記事を表示

ページネーションの実装

##「kaminari」というGemをインストール
“`ruby:Gemfile
gem ‘kaminari’
“`
ターミナル(実装したいアプリのディレクトリ)でbundle installを実行し、rails sで再起動

kaminariを導入すると、モデルクラスにpageメソッドとperメソッドが定義されます。
2つのメソッドは、よく以下のように使われます。
【例】

“`
変数名 = クラスを利用して取得したレコードのインスタンス.page(params[:page]).per(1ページで表示したい件数)
“`
##コントローラーを編集
“`tweets_controller.rb
def index
@tweets = Tweet.includes(:user).order(“created_atDESC”).page(params[:page]).per(5)
end
“`
##ビューを編集
以下の1行を任意の場所に記述すれば実装が完了です。

“`index.html.erb
<%= paginate(@tweets) %>
“`

元記事を表示

【Rails6】CarrierWaveを使い、複数の画像を一斉に投入する2つの方法/①seedの初期データで投入/②CSVでインポートする

他のtextカラムは簡単に複数投入できるのですが、image(画像)カラムだけはいずれもnilになってしまい苦労したので、ここに複数の画像カラムを一斉に投入する2つの方法を記しておきます。

##環境
* Ruby 2.6.5
* Rails 6.0.3.2

##①複数の画像カラムをseedの初期データで投入する方法

`db/migrate/seed.rb`に、

“`seed.rb

Post.create!(image: /public/uploads/post/image/1/yatoguti.jpg,
park: 谷戸口公園,
outline: 程久保の知る人ぞ知る,
location: 東京都日野市程久保1丁目20−14,
access: モノレール程久保駅から徒歩5分)
“`

のように記載し、`rails db:reset`してから、`rails db:seed`するが、

“`seed.rb

=> [#

元記事を表示

OTHERカテゴリの最新記事