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

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

【Rails】初心者が image_tagで画像のサイズ変更(模索中)

###1. form_tagで画像を表示する

“`erb

  • <%= image_tag @post.image.url,size:"180x200" %>
  • または

  • <%= image_tag @post.image.to_s,size:"180x200" %>
  • “`

    表示することができるようになったコードは↑です。
    gemはcarrierwaveとmini_magickをインストールしました。

    ###2. 失敗例
    “`erb

  • <%= image_tag @post.image.url %>
  • “`
    sizeを定義しないと、画像サイズが巨大でブラウザがめちゃくちゃに。
    erbファイルにsize指定を外して、uploaderでリサイズしようとしても変化がない。↓

    “`rb
    version :thumb do
    process resize_to_fill: [50, 100]
    end
    “`

    ###4. 今後の課題
    erbファイルに直接size指定をしたことで、ブラウザ表示自体のフォーマットが崩れるエラ

    元記事を表示

    rails c が立ち上がらず大量の行のエラーが出る

    #問題
    中間テーブルを作成した後くらいにrails cでコンソールを立ち上げようとしたが、以下のようなエラーが出た

    “`
    : Unknown key: :throught. Valid keys are: :class_name, :anonymous_class, :foreign_key, :validate, :autosave, :table_name, :before_add, :after_add, :before_remove, :after_remove, :extend, :primary_key, :dependent, :as, :through, :source, :source_type, :inverse_of, :counter_cache, :join_table, :foreign_type, :index_errors (ArgumentError)
    “`

    rails sも立ち上がらず。

    #結論
    中間テーブルのアソシエーションが間違っていた。以下のように修正した後、db:migrate:resetで解決。

    roomsテーブルとusersテ

    元記事を表示

    Ruby on Rails ログイン機能の実装(devise編)

    ###概要
    gem’devise’を使ってログイン機能を実装する
    パスワードとメアドでのログインではなく、名前とパスワードのログインに変える。

    ###今回の目標と自身の環境
    – deviseを使用し、ログイン機能を実装
    – 名前とパスワードでのログインに変更
    – Ruby 2.7.0
    – Rails 6.0.3.3

    ###実装
    ####準備
    “`:Gemfile
    #一番下に追加
    gem ‘devise’
    “`
    Gemfileの編集後にターミナル以下のコマンドを実行

    “`:ターミナル
    bundle install
    rails g devise:install
    rails g devise User
    rails db:migrate
    “`
    ただし、今回は名前でログインすると決めているので、rails db:migrateする前にマイグレーションファイルを編集する。

    “`:db/migrate
    #t.timestamps null: falseの上に追加
    t.string :name
    “`
    ####viewの作成
    “`:ターミナル
    rails g d

    元記事を表示

    Ruby on Rails ログイン機能の実装(Session編)

    ###概要
    sessionを使用しログイン機能を実装する。
    session(session[:user_id] = 1)の使い方を理解する 

    ###sessionとは
    ステートフルな通信を実現するための仕組みのこと。

    通常のブラウザ(ステートレス)の通信では、ページが変わるたびに前のページの情報は全て破棄されてしまう。
    つまり、前のページでログインしても、次のページに遷移したときログインしていると言う情報が引き継がれないため、遷移するたびにログインが要求されることになる。(非常に不便)

    そのため、前のページの情報を引き継ぐことが可能なステートフル通信を実現する必要がある。
    具体的には、データをクッキー(cookie)に保存することでステートフルな通信を実現できる。

    ###今回の目標と自身の環境
    gem “devise” を使用せずにログイン機能を作る

    Ruby 2.6.3
    Rails 6.0.3.3
    gem “bcrypt” を使用(パスワードの暗号化のため)

    ###実装
    ####sign in(新規登録)機能の作成

    “`:ターミナル
    #

    元記事を表示

    続・初見で難解だったdeviseを改めてまとめてみた

    #はじめに
     前回の「初見で難解だったdeviseを改めてまとめてみた」の続き。今回はログアウト機能について。
    deviseの導入について説明している、前回の投稿はこちら↓
    https://qiita.com/TerToEer_sho/items/b5523ad100d08126a547

    ##ログアウト機能の実装
     
     そもそも、ログアウトのボタンは、ログインしているユーザーにしか必要がない。
     つまり、
    ログイン状態であれば、ログアウトボタンを表示させる。
     また、ログインしている状態であれば、ログアウトボタンは必要ない。
     つまり、
    ログインしていない状態であれば、ログインボタンを表示させる。

     では、どのようにして、ログインしているのかどうかを判断するのか。これもまた、deviseの優れたところで、deviseのGemをインストールすると使えるメソッドがある。

    user_signed_in?メソッド

     日本語訳通り、サインインしているか

    元記事を表示

    Modelのインスタンスからカラム名を取得する

    一覧画面作成時に表示用のキー名リストがあったらいいなと思い書いてみました。

    #手順
    ## 1. Model作成

    何かしらのModelを作成

    “`ruby:models/user.rb
    class User < ApplicationRecord include Table #ここでインクルードすると、インスタンスメソッドとして使える attribute :name attribute :email attribute :login_id attribute :password end ``` ## 2. Modelインスタンスからカラム名を取得するメソッドを作る ```ruby:models/concerns/table.rb module Table extend ActiveSupport::Concern # カラム名(シンボル)を配列で取得 def table_keys self.class.column_names.map(&:to_sym).reject { |column| %i[id created_at upda

    元記事を表示

    2020/10/1 テックキャンプ11日目 アウトプット

    #カリキュラム応用編
    テックキャンプ11日目で初投稿^^;
    事前学習スタートは 9/12です。

    ##学習内容
    – Railsで投稿アプリをつくろう
    – 基礎編の簡易投稿アプリと違いcontrollerの機能が多い
    – データベース復習

    – database.ymlとはデーターベースの設定を記述するファイル
    Railsは、このdatabase.ymlを編集することで、データベースの設定を運用環境ごとに変更できる仕組みになっている。

    – RDB(リレーショナル・データベース)とは表形式でデータを管理するデータベース。行と列を持っており、データベースにおいては、行を「レコード」、列を「カラム」という。
    – RDBMS(RDB・マネジメント・システム)とRDB(リレーショナル・データベース)を使用する際、それを管理するシステムをRDBMSという。
    – MySQLとはRDBMSの1つ
    – 拡張機能が多い
    – 小規模から大規模のデータも取り扱いが可能
    – 柔軟性が高い

    元記事を表示

    部分テンプレート collectionオプションでundefined local variable or methodエラー

    ## 記事の目的
    初学者の為、間違っているところはご指摘頂けると幸いです。
    備忘録・アウトプット目的で投稿です。

    部分テンプレートがよくわからない方は、こちらの記事がわかりやすいです。
    https://pikawaka.com/rails/partial_template#collection%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3

    ##collecitonオプションでエラー
    エラーの原因となるコードです。

    “`show.html.slim(部分テンプレートを呼出しているファイル)
    = render partial: ‘reviews/user_review’, collection: @reviews
    “`
    私の認識としては、@reviewsの要素のひとつひとつが以下の部分テンプレート先のreviewに代入されることを期待。しかし、以下のようにreviewが未定義とのエラーが出る。値が渡っていない。

    “`エラー内容
    ActionView::Template::Error (undefined local variable

    元記事を表示

    モデルのテストコードは何をテストしているか

    #何がわからないか
    ・モデルの単体テストコードは何をテストしてるか
    ・パスワードなどの文字制限や空欄を防ぐバリデーションはどこに書いてあるのか
    #railsアプリとgem(devise)とDBの図
    バリデーションの記述場所、何をテストしているかについて整理する。
    ![IMG_1915.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693815/51907b53-7be1-7dd6-130f-5c81c9ab4796.jpeg)
    ・deviseはrailsアプリのモデルと繋がっている。
    ・deviseのバリデーションはconfig/initialize/devise.rbに記述してある
    ・gemを経由しないモデルのバリデーションはモデル内に記述する。
    ・モデルの単体テストはバリデーションが機能するかを確認している。

    元記事を表示

    RailsのKnockでJWTを手動生成する方法

    jwtを作成してくれるgemであるknockを使って,iosとRails間の認証機能を作っていたのだが、
    新規ユーザーの作成の成功と同時にログイン状態にしたいのだが、当初の新規ユーザー登録の流れは、

    ① user/createでユーザーを新規作成.
    → ユーザー情報を返す。

    ② そのユーザー情報をリクエストボディに入れて、user_tokenにpostリクエストを送りjwtを受け取りログイン状態にする。

    と、二回APIを叩く必要があった。これをuser/createのレスポンスをjwtにすることで一回にしたい。

    以下の様にした。

    “`ruby:
    def create
    user = User.new(user_params)
    if user.save
    token = Knock::AuthToken.new payload: { sub: user.id }
    render status: :created, json: token
    else
    render status: :unprocessable_entity, json:

    元記事を表示

    rails のアクセス制限

    #種類
    ログインしていないユーザーに対するアクセス制限
    ログイン中のユーザーに対するアクセス制限
    viewファイルへの記述

    #具体的な手順

    ##ログインしていないユーザーに対するアクセス制限
    コントローラーへ`before_action`を記述

    “`***controller.rb
    before_action :forbid_login_user, {only: [:top]}

    #~その他の記述は省略~
    def autheniticate_user
    if @current_user.nil?
    flash[:notice]=”ログインしてください”
    redirect_to(“/URL”)
    end
    end
    “`

    ##ログイン中のユーザーに対するアクセス制限
    コントローラーへ`before_action`を記述

    “`***controller.rb
    before_action :forbid_login_user, {only: [:top]}

    #~その他の記述は省略~

    def fobid_login_user
    if @current_us

    元記事を表示

    【環境構築】Rails + MySQL + Docker   (初心者も30分でOK!)

    ### Dockerを使った環境構築
    「環境構築はコードを書くよりも難しい」と聞いたことがあります。

    ### Dockerは簡単!
    何故かと言うと、、、
    **コピペするだけ**でいいから
    ただし、理解するまで少し時間がかかるかも、、、
    まずは簡単な概要から

    ### Docker
    仮想環境を構築するための道具

    ### コンテナ
    仮想環境そのもの
    (DockerはDockerエンジンの上にコンテナが動く)

    ### イメージ
    Dockerコンテナを実行するために必要なもの。

    ### 環境構築の手順
    ①.“`プロジェクト(ディレクトリ)を作成し、移動する“`

    $ mkdir アプリ名
    $ cd アプリ名
    ②.“`Dockerfile、docker-compose.yml、Gemfile、Gemfile.lockを作成する“`

    $ touch Dockerfile docker-compose.yml Gemfile Gemfile.lock
    ③.“`エディタを開き、Dockerfile、docker-compose.yml、Gemfileを下記か

    元記事を表示

    メールアドレスの一意性を検証する

    #ユーザーID以外でユーザーを区別しよう

    1人のユーザーが何個でもアカウントを作れるのは問題ですよね。
    DBの運用コスト、収集するユーザー情報の質、これらの障害になりかねません。
    ユーザーIDがユーザーに割り振られるのはアカウントを作った後です。
    ユーザーを区別するユーザーID以外の何かが必要です。

    #メールアドレスで区別しよう

    メールサービスの事業者次第ですが、基本ユーザーが同じメールアドレスを複数持つのは不可能です。
    メールアドレスでユーザーを区別しましょう。

    #ユーザーの行動を制限しよう

    具体的には既にDBに登録されているメールアドレスと同じものを使って登録できないようにします。
    Railsユーザーは次の機能で実現可能です。

    #バリデーションで制限しよう

    RailsではDBにデータを保存する際、データが要求を満たさなければ保存を拒否できます。
    ユーザーの入力に介入できるのです。
    この機能をバリデーションと言います。
    バリデーションはデータの検証〜拒否まで行います。

    #バリデーションを設定しよう

    バリデーションに検証する属性と、属性の何を検証したいのか設定しましょ

    元記事を表示

    VSCodeで作業する時に、erbでhtmlタグの自動生成機能を有効にする

    ## はじめに
    erbで、htmlタグを自動生成する機能を使えるようにするにはどうしたらいいのかについて簡単に説明しています。

    プログラミングはじめたての頃、
    「htmlで自動でタグが自動で生成されていたのに、erbで開発で開発するようになったら今までのようにならない。」と言う経験があったので、解決方法をまとめてみました。

    ## 手順

    ### Rubyの拡張機能を入れる。
    railsで開発していれば入っているかと思いますが、確認です。

    ### setting.jsonを開く
    commnad+shift+pを押して、`setting.json`と検索して、setting.jsonを開きます。
    こんな感じのファイルです。

    “`ruby:setting.json
    {
    “editor.tabSize”: 2,
    “editor.renderWhitespace”: “all”,
    “files.autoSave”: “onFocusChange”,
    “explorer.confirmDragAndDrop”: false,
    “window.zoo

    元記事を表示

    ruby,railsでプログラミングはじめたての時に、効率よく学ぶためのVScode拡張機能

    ## はじめに
    **VSCodeにはタグを自動で生成してくれる便利な拡張機能があります。**
    こう言うことをきちんと知って始めないともったい。
    と言うのも、知らずに効率の悪い作業を続けてきたので、とりあえず入れたらいいんじゃないかと思う拡張機能をまとめました。

    ## コードを印刷する
    ### PrintCode
    コードを印刷できる。
    ブラウザで印刷画面が開き、印刷することができる。
    細かい設定はできません。
    紙でコードをすぐに参照できるようにしておくと、勉強したてのころは結構よかったりしました。

    ## タグ入力
    ### Ruby
    コードを見やすく色付けしてくれたりするなどの基本機能が入ったものです。

    ### Auto Close Tag
    HTMLのタグを`div`と打ってtabキーを押すなりすれば、自動で`

    `と変換されます。
    気をつけたいのが、erbだと動きません。
    対処は、「[erbでhtmlタグの自動生成機能を有効にする](https://qiita.com/Tigris3313/items/3e79f4d9f592f80fac67 “erbでhtmlタ

    元記事を表示

    rails g scaffoldの使い方、機能、注意点

    #scaffoldとは
    一言で言えば、必要なファイルをすべて作成し、DBも含めたルーティングも済ませてくれるコマンド。

    #生成方法

    “`
    $rails g scaffold モデル名 カラム名1:データ型 カラム名2:データ型 ….
    “`

    ###生成されるファイル
    モデル
    マイグレーションファイル
    コントローラー
    ビュー
    ルーティング

    ##生成されたファイルの中身
    仮に`usersinfo`というモデル名で`nameカラムageカラム`を生成した場合。

    “`
    $rails g scaffold usersinfo name:string age:integer
    “`

    ####モデル
    特別な記述はないので省略。

    ####マイグレーションファイル

    “`*******_*******.rb
    class CreateUsersinfos < ActiveRecord::Migration[5.1] def change create_table :usersinfos do |t| t.string :name #生成時に指定したカラム

    元記事を表示

    任意の3つの数字を、同じ値を除外して合計を出力する方法

    【概要】
    —————————————-
    1.結論

    2.どのようにコーディングするのか

    1.結論
    —————————————-
    配列、eachメソッド、if文を使う!

    2.どのようにコーディングするのか
    —————————————-

    “`ruby
    def any_three_sum(array)
    unique_nums = [] #—❶
    array.each do |num| #—❷
    count = 0
    array.each do |i| #—❸
    if num == i
    count += 1
    end
    end
    if count < 2 #---❹ unique_nums << num end end three_sum = 0 #---❺ u

    元記事を表示

    【No.004】発注者の注文一覧画面を修正

    [Issue](https://github.com/fukadashigeru/import_agent_app/issues/9)
    [PR](https://github.com/fukadashigeru/import_agent_app/pull/10)

    # 概要
    発注者の注文一覧画面を修正する

    # ToDoリスト
    – [x] ステータスのenum化
    – [x] 編集ボタンをfontawsomeに
    – [x] 横幅が狭い時に横スクロールを可能に

    # ToDo詳細
    ## ステータスのenum化

    [Rails 国際化 (i18n) API](https://railsguides.jp/i18n.html)
    [[初学者]Railsのi18nによる日本語化対応](https://qiita.com/shimadama/items/7e5c3d75c9a9f51abdd5)
    [Railsでi18nを使った日本語化をする](https://qiita.com/rearail/items/5554fab137ef8635a1af)

    “`ruby:config/applicati

    元記事を表示

    【No.003】発注者の注文一覧画面を作る

    [Issue](https://github.com/fukadashigeru/import_agent_app/issues/7)
    [PR](https://github.com/fukadashigeru/import_agent_app/pull/8)

    # 概要
    発注者の管理画面をつくる

    # ToDoリスト
    – [x] Order::OrderingOrgSidesController追加
    – [x] routes.rbをいい感じに
    – [x] Orderモデル追加
    – [x] Orderのレコードを作成する内容をseedに追加
    – [x] Slimの導入
    – [x] TailWindの導入
    – [x] 見た目をFigmaに近づける

    # ToDo詳細
    ## Order::OrderingOrgSidesController追加

    ターミナルで下記をたたく。

    “`
    bin/rails g controller order::ordering_sides
    “`

    app/controllers/orders/ordering_org_sides_controller.r

    元記事を表示

    初見で難解だったdeviseを改めてまとめてみた

    ##はじめに
     deviseとの出逢いは最悪でした。そもそもGemという概念すら曖昧で、MVCモデルの流れが少しわかるようになってきた段階でインストールした記憶がある。deviseでは、基本的にコントローラーを触らないので、初見ではなぜ勝手にアクションが実行されているのかが理解できなかった。なので、改めて「これだけ!」というものをまとめた次第。

    #deviseとは
     deviseはユーザー管理機能のに特化したGem。サインインやログアウトなどの設定が簡単になる。つまり、手動でルーティングの設定やコントローラー…をしなくて済む。ユーザー登録をしてサービスが受けられるアプリケーションなら、導入すると、開発が早くなるというメリットがある。

    ##全体の流れ
    1. Gemfileに追加
    1. deviseをインストール
    1. モデルの作成
    1. テーブルの作成
    1. 新規登録とログインのためのリンク設定
    1. 新規登録のためのビューファイルの作成

    今回は新規登録のみを扱う。

    ###1. Gemfileに追加
    “`ruby:Gemfile
    gem ‘devise’
    “`
    ・ファイルの最

    元記事を表示

    OTHERカテゴリの最新記事