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

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

ActiveModelで生成したオブジェクトのdeep copy

## やりたいこと
タイトルのまま。ActiveModel::Modelで生成したオブジェクトをattribute含めて全て別のオブジェクトとして複製したい。

## ActiveSupportのdeep_dupを試してみた
結論を書くとattributeまで複製されなかったので失敗。

“`ruby
class Test
include ActiveModel::Model
include ActiveModel::Attributes

attribute :name, :string
attribute :age, :integer
end

original = Test.new(name: “Abe”, age: 65)
clone = original.deep_dup

# 表面のオブジェクトは別物が生成
original.object_id # => 33487180
clone.object_id # => 33536560

# でも属性は同じものを指している
original.name.object_id # => 33576180
clo

元記事を表示

Dockerでwheneverを扱う時No such file or directory – crontabが出る

簡単に定時処理が書ける便利なgem「whenever」

dockerでアプリ作成時、wheneverを使った処理をしようとしたが、つまづいてしまったので忘備録として記述しておきます。

#環境
Ruby 2.5.1
Rails 5.2.4.3

#やりたいこと
今回はpostというモデルを用意し、wheneverを使って1分事にpostを作成してみる。
dockerの環境構築は終わっているものとしてスタート。

##modelとcontrollerを作成
docker上で

“`
root@6181bdf78fa7:/myapp# bundle exec rails g model post name:string
root@6181bdf78fa7:/myapp# bundle exec db:migrate
root@6181bdf78fa7:/myapp# bundle exec rails g controller posts
“`

##wheneverの設定
まずはgemをインストール

“`ruby:Gemfile
gem ‘whenever’, requir

元記事を表示

[rails]redirect_toとrenderの違い

#redirect_toとrenderの違い
初めの頃は違いなんて理解せずに使ってました。
処理の流れが違ったんですね。

##redirect_toの場合

“`
①controller(redirect_to) → ②HTTPリクエスト → ③ルーティング → ④controller → ⑤view
“`

##renderの場合

“`
①controller → ②view
“`

僕の感覚ではあるんですが、基本的にrenderは部分テンプレート以外であまり使わない気がします。

元記事を表示

link_toの下線を消す

#プログラミングの勉強日記
2020年8月3日 Progate Lv.226
aタグと同じようにlink_toの下線を消す。(メモ)
HTMLのリンクについては[こちらの記事](https://qiita.com/mzmz__02/items/2ac88037d8f99bee5ac8)で扱っている

#方法
 1.`link_to`にクラスを付ける。

“`erb:layouts/application.html.erb

  • <%= link_to("User List", "/users/index", class:"userList") %>
  • “`

     2. scssファイルまたはcssファイルで下線を消す処理をする

    “`css:stylesheets/application.css
    .userList{
    text-decoration: none;
    }
    “`

    元記事を表示

    バリデーションを設定

    #バリデーションとは
    パラメーターを受け取った時に該当カラムにデータが入っているか確認する機能です。

    以下の例の場合、nameカラムがnil(データがない)であるかどうかを確認します。
    nilだと保存されません。

    “`app/models/user.rb
    class User < ApplicationRecord validates :name, presence: true end ```

    元記事を表示

    No such file or directory @ rb_sysopen – /Users/○○/Gemfile.lock (Errno::ENOENT)で苦しんだ

    railsコマンドを打とうとすると

    “`
    $ rails ○○
    Traceback (most recent call last):
    4: from bin/rails:3:in `

    `
    3: from bin/rails:3:in `load`
    2: from /Users/user/[プロジェクト名]/bin/spring:10:in ``
    1: from /Users/user/[プロジェクト名]/bin/spring:10:in `read`
    /Users/user/[プロジェクト名]/bin/spring:10:in `read`: No such file or directory @ rb_sysopen – /Users/user/[プロジェクト名]/Gemfile.lock(Errno::ENOENT)
    “`
    こんなエラーが出てしまい号泣。

    ## 原因
    railsコマンドでは、gemのバージョンも確認工程に含まれるため`Gemfile.lock`の中身が参照

    元記事を表示

    rails開発の条件分岐のあれこれ

    #rails開発の条件分岐のあれこれ
    rails でのwebアプリケーション開発であるといい記述をまとめてみました!
    ###投稿に対して投稿者のみ編集・削除ができるようにしたい!
    rails でSNSのようなアプリケーションを作るとき,投稿に対してユーザー誰もが編集したり
    削除できるとダメですよね!
    そんなとき便利なのが下の条件分岐です!

    **devise(Gem)をインストールしていうることを前提とします**

    “`post.rb
    belongs_to :user
    “`

    “`user.rb
    has_many :posts
    “`

    “`route.rb
    resources :post, only: [:show]
    “`

    “`post_controller.rb
    def show
    @film = Post.find(params[:id])
    end
    “`

    “`show.html.erb
    <% if @post.user_id == current_user.id %> #追記
    <%= link_to "編集する", e

    元記事を表示

    A server is already running(rails sのプロセスが切れない)をさっさと解決する

    **サーバーを起動しようとすると以下がでるときの対処法**を数種類まとめました!
    どれかで解決できる(はず)。

    “`
    ❯ rails s
    => Booting Puma
    => Rails 5.0.7.2 application starting in development on http://localhost:3000
    => Run `rails server -h` for more startup options
    A server is already running. Check プロジェクト名/tmp/pids/server.pid.
    Exiting
    “`

    何種類もあるため、上手くいかないときは順番に試してみるコトをおすすめします。

    ## まず確認すること
    たまに`Mac標準のターミナルでサーバー起動状態` & `VSCodeなどのテキストエディタ上のターミナルでサーバー起動しようとしている`方がいるので、
    まずは**別のターミナルで既にサーバーを動かしていないか**を確認しましょう!

    ## パターン①
    `railsのプロセス`を削除する

    “`
    $ rail

    元記事を表示

    RailsでOpenWeatherMapから天気予報を取得する

    # 初めに
    Qitta初投稿です!
    初心者なので至らぬ点も多いかと思いますが、暖かくコメント頂けると嬉しいです!

    # 概要
    – 無料のapiを提供している[OpenWeatherMap](https://openweathermap.org/api
    )のapiを叩くことで、全国各地の天気予報を取得する。
    – HTTPリクエストは[httpclient](https://github.com/nahi/httpclient)を使用し、rake taskにすることで定期的に叩けるように実装する。

    # 開発環境
    ruby: 2.7.1
    rails: 6.0.3.2

    # 手順
    1. API KEYの取得
    2. 取得したい都市のCITY IDを取得
    3. Cityテーブルの作成・保存
    4. HTTPリクエストの実装
    5. WeatherForecastテーブルの作成・保存

    # 1. API KEYの取得
    OpenWeatherMapのホームページにアクセスし、Sign inから[Create an account](https://home.openweathermap.org/user

    元記事を表示

    Route53でドメインを登録した際にNginxのページが表示されてしまう時の対処

    # 経緯
    ・Railsのアプリケーションは既にAWSへデプロイ済み
    ・せっかくならIPアドレスのままではなく、独自ドメインで表示したい!

    # 行ったこと
    1.お名前.comでドメインを購入。
    2.Route53でホストゾーンを作成し、ネームサーバーをお名前.comからRoute53へ変更。
    3.レコードセットを作成し、ドメインに紐づくIPアドレスを登録

    # 起こった問題
    AWSのコンソール、レジストラ側の設定が全て完了して、いざ取得したドメインで自分のサイトが開ける。と思ったが、Nginxのページが出てしまいアプリケーションへアクセス出来ない。
    スクリーンショット 2020-08-02 18.22.25.png

    # 対処
    ・Nginxの設定で新しいドメインのURLを明記する

    EC2へログインして、

    元記事を表示

    jquery.raty rails導入

    #はじめに
    – Golf GearのReviewサイトを作成中。
    – Reviewの評価を星で表示する。
    – 公式サイトはなぜかアクセスできないので、githubや画像をそれぞれ拾ってきて、表示できるようにする。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630397/69fd5ef9-387f-ee40-f8c9-320d5609b423.png)

    #jquery.raty.jsファイルとstar画像を配置

    – jquery.raty.js
    (https://github.com/wbotelhos/raty/blob/master/lib/jquery.raty.js)
    上記記述をコピーし、`jquery.raty.js`というFile名で、`app/assets/javascripts`下に配置。
    – DOWNLOADからFileをダウンロードし、imgフォルダから、`star-on.png`, `star-off.png`, `star-half.png`を`app

    元記事を表示

    ファイル保存先をS3に設定後、RailsアプリをHerokuにpushすると失敗するエラーについて

    ## エラー発生の経緯

    本番環境でファイルを投稿後、1日程経つとファイルが表示されなくなる問題が発生していたため、HerokuへデプロイしていたRailsアプリを更新し、ファイルアップロード先をAWS S3に変更しました。

    ローカル環境では適用に成功しましたが、`git push heroku master`コマンドで本番環境に適用しようとするとエラーが発生しました。

    エラー内容

    “`zsh:ターミナル
    Caused by:
    ArgumentError: key must be 16 bytes
    “`

    ## 結論

    以下のコマンドで環境変数を設定するとエラーが解消されました。
    “ heroku config:set RAILS_MASTER_KEY=`cat config/master.key` “

    ## 原因
    元々下記のようなエラーが出ており、解消のために
    “ heroku config:set RAILS_MASTER_KEY=`rake secret` “
    と言うコマンドで環境変数を設定していました。

    “`zsh:ターミナル

    —–> Pre

    元記事を表示

    [rails]画像の投稿方法

    #画像投稿方法
    画像の投稿方法はこんな感じの手順です。

    ・refileをgemfileに追加
    ・image_idカラムを追加
    ・attachmentメソッドを追加する
    ・Strong Parametersにimage_idを追加する
    ・viewファイルにf.attachment_fieldを埋め込む

    ###1.refileをgemfileに追加
    refileの役割
    ・画像を簡単に組み込むことができる。
    ・サムネイルを生成できる。
    ・ファイルのアップロード先を設定できる。

    refile-mini-magickは画像をサイズを変更するためのgemです。

    “`
    # 画像投稿用gem
    gem “refile”, require: “refile/rails”, github: ‘manfe/refile’
    # 画像加工用(サイズ調整など)gem
    gem “refile-mini_magick”
    “`

    bundle installは忘れずに。

    “`
    $ bundle install
    “`

    ###2.image_idカラムを追加
    Userテーブルにimage_idカラムを追加

    元記事を表示

    rails 本番環境のエラーをブラウザで表示する方法

    ##結論
    下記を変更するだけで本番環境でもブラウザ上でエラーを表示することが可能である。

    “`
    //config/enviroments/production.rb
    config.consider_all_requests_local = false 変更前
    config.consider_all_requests_local = true 変更後
    “`

    ## 注意点
    本番環境の詳細なエラー内容がユーザに見えてしまうのはよくないので、
    エラー原因が特定できれば元に戻すのが良いかと思います。

    開発環境ではエラーが存在する場合、ブラウザ上で表示してくれる。
    しかし、本番環境ではproduction.rbのログを見たり、unicornやnginxのエラーログを見るくらいしか知らなかった。

    元記事を表示

    [Rails] Serviceクラスの設計で悩んだこと

    RailsでServiceクラスの設計について考えたことを、まとめておきます。
    (まだ最適解には至ってないです)

    # 会員登録機能を作る
    分かりやすいように例として、よくあるユーザの会員登録機能を実装してみます。
    パスワードの暗号化、認証urlの発行、認証メールの送信など、Controllerに全て書くとfatになってしまいそうです。こういう処理の流れは1つの処理の流れとしてどこかにまとめて書いた方が良さそうです。

    # Serviceクラスの役割とは
    自分の中でServiceクラスの役割として、

    – ロジックの集約
    – Controllerの肥大化を防ぐ
    – ユースケースを表現する

    があると思っています。会員登録はユースケースとして捉えることができるので、Serviceクラスに当てはまりました。

    # いざ設計
    では、具体的に設計を考えてみます。まず、漠然と呼び出しのイメージを考えてみます。

    “`ruby:registration_controller.rb

    class RegistrationController < ApplicationController d

    元記事を表示

    Rails testで「 FATAL: Listen error: unable to monitor directories for changes.」のエラー

    #前提
    Rails 6.0.3
    ruby 2.6.3

    #本題

    “`
    $rails test
    “`
    のコマンドを実行した時に以下のエラーが発生。

    “`
    $ rails test
    FATAL: Listen error: unable to monitor directories for changes.
    Visit https://github.com/guard/listen/wiki/Increasing-the-amount-of-inotify-watchers for info on how to fix this.
    “`

    1つのユーザIDに対して生成できるinotifyのインスタンスの数の上限に達してしまったようなことが書かれている?のではないかと思いました。
    エラー内容に書いている通り、Githubを確認しコマンドを入力し解決。

    ##解決方法
    ユーザーインスタンスを確認。

    “`
    $ cat /proc/sys/fs/inotify/max_user_instances
    “`
    inotifyのインスタンス上限を変更。

    “`
    $ echo fs.in

    元記事を表示

    【Rails】一意性を保つバリデーションの実装

    #一意性バリデーションの実装に必要なタスク

    1. アプリ側に記述(uniqueness: true)
    2. データベース側に記述(unique: true)

    #アプリ側に記述
    “`models/user.rb
    validates :email, uniqueness: true
    “`

    #データベース側に記述

    “`
    $ rails g migration add_column_to_users
    “`

    “`add_column_to_users.rb
    def change
    add_index :users, :email, unique: true
    end
    “`

    “`
    $ rails db:migrate
    “`

    テーブルのカラムに一意性を持たせるには、**インデックスの作成**も必要になる。
    理由は、全てのデータを検索することで、過去のデータと重複しているか確認できるため。

    元記事を表示

    オリジナルのアプリを完成させるまでの解説

    #環境
    macOS 10.15.5
    Rails 5.2.4.2
    Docker 19.03.12

    #概要
    オリジナルアプリの概要はCRUDのシステムを意識した簡易的なメモアプリの開発です。
    簡易的なアプリと言っても実用性には欠かないよう注意を払いました。行数が増えてもレイアウト崩れが起きないように実装し、文字数制限や空白の項目が新規作成されないようにも設定しました。

    Dockerを用いてフレームワークはRailsを使用しました。そしてHerokuにより公開をしています。

    #オリジナル性について
    HTMLに関してはclass名などは学習サイトをヒントに用いて、デザインは外観は学習サイトをヒントにしましたが実装は全て自走で行いました。
    Railsの機能の実装に関して事前に学習サイトを何度も繰り返し行い、CRUDの機能を頭に入れてから今回の作成を行いました。そのため短いコードなどはなるべくサイトなどを参考にせず、自分で覚えた内容で実装し、コマンド操作は基本的に全て頭に入れた内容のみで行いました。

    #サイトについて
    スクリーンショット 20</p></blockquote>
</blockquote>
<aside class='widget widget-post'>
<div class='tag-cloud-link'>Ruby</div>
<div class='tag-cloud-link'>Rails</div>
<div class='tag-cloud-link'>Heroku</div>
<div class='tag-cloud-link'>Docker</div>
</aside>
<div><a style='width:100%;' class='btn__link' href='https://qiita.com/chisaki0606/items/ee6ed51a78784720b3f8'>元記事を表示</a></div>
<h3 id=railsで動画を投稿する

    今回、初投稿させていただきます。
    少し、見にくかったりしてもご了承お願いします。

    今回は、railsで動画アップロード機能の備忘録となっております。
    個人的にFFmpegを使用した動画アップロードが分かりにくかったので、なるべく分かりやすく説明できればと思います。

    #環境
    Ruby 2.6.5
    Rails 6.0.3.2

    #早速取り掛かっていく

    “`ruby:ターミナル
    rails new RailsApp
    “`
    ターミナルでRailsAppを作ります。

    “`ruby:Gemfile
    gem ‘carrierwave’
    gem ‘mini_magick’
    “`
    Gemfileに追記

    “`ruby:ターミナル
    rails bundle install
    “`
    ターミナルでbundle installします。

    “`ruby:ターミナル
    rails g uploader video
    rails g scaffold post video:string
    “`
    ターミナルでuploaderとscaffoldを作成

    “`ruby:ターミナル
    rails db:mig

    元記事を表示

    has_manyとbelongs_toの使い方

    #プログラミングの勉強日記
    2020年8月2日 Progate Lv.226
    `has_many`と`belongs_to`の使い分けに戸惑った。`has_many`のときに複数形にするのを忘れてしまい、うまく実行されなかったので、`has_many`と`belongs_to`についてまとめる。

    #関連付け(アソシエーション)とは
     2つのテーブルを関連付けさせること。テーブル間の関係をモデル上の関係として操作する仕組み。
     テーブル同士の関係には「1:1」「1:多」「多:多」の3つの関係が存在する。今回は「1:1」「1:多」の関係を表すときに使う`has_many`と`belongs_to`についてまとめる

     今回は、UserテーブルのidをPostテーブルと関連付けをして、誰の投稿かわかるようする。

    #has_manyとは
     `has_many`は「1:多」の関連付けを表し、〇〇が複数の〇〇を所有しているという関係を表す時に使う。関連付けをすることによって、データをまとめて扱えるようになるので、より効率的にデータベースを操作することができる。

    “`ruby:models

    元記事を表示

    OTHERカテゴリの最新記事