20200217のRailsに関する記事は22件です。

[Rails] Params

Paramsメソッドとは

Railsで送られたきたパラメーターを受け渡しするメソッドです。主にコントローラーに記載します。
a.png

例:app/controllers/posts_controller.rb


class PostsController < ApplicationController
  def index
    @posts = Post.all
  end

  def new
  end

  def create
    Post.create(content: params[:content])
  end
end



#左側がテーブルのカラム名、右側がparamsとして送られてきたデータ。
#Post.create()で実際にテーブルに登録したいデータを記載

createメソッド

ActiveRecordのメソッドの一種。テーブルにレコードを追加します。
モデル名.メソッド(ここではcreate)。updateも同じように使える。

ストロングパラメーターとは

指定したキーを持つパラメーターのみを受け取るようにするもの。

プライベートメソッドとは

クラス外から呼び出すことのできないメソッド。主にストロングパラメーターとセットになっている。

app/controllers/posts_controller.rb

class PostsController < ApplicationController
  def index
    @posts = Post.all
  end

  def new
  end

#ストロングパラメーター
#post_paramsメソッドを呼び出し
  def create
    Post.create(post_params)
  end

#プライベートメソッド
  private
  def post_params
    params.permit(:content)
  end
end

form_tagとform_withでの記載の違い

# form_tagを使用した時のストロングパラメーター
def post_params
  params.permit(`カラム名`)
end

# form_withを使用した時ストロングパラメーター
def post_params
  params.require(`モデル名`).permit(`カラム名`)
end

form_withの場合はrequireをつける。

findを使う場合

  def show
    @post = Post.find(params[:id])
  end

a.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rails_マイグレーション関連

モデル作成(create_table)

command
bundle exec rails g model User

User.rbとマイグレーションファイルが作成される。

create_users.rb
class CreatePosts < ActiveRecord::Migration[6.0]
  create_table :users do |t|
    t.integer :code, null: false, default: 0
    t.string :name, limit: 30, default: ""
    t.string :password, default: ""
    t.text :description, default: ""
    t.date :hire_date
    # t.timestampsで以下2つを追加
    t.datetime :created_at
    t.datetime :updated_at
  end
end

カラム追加、削除、変更

command
bundle exec rails g migration change_columns_to_users(※適当なファイル名)
change_columns_to_users.rb
class ChangeUsersColumns < ActiveRecord::Migration[6.0]
  def change
    add_column :users, :password_digest, :string, after: :name # 追加
    remove_column :users, :password, :string                   # 削除
    change_column :users, :name, limit: 20, default: ""        # 変更
  end
end

マイグレーション実行

command
bundle exec rails db:migrate
            or
bundle exec rake db:migrate

コントローラ作成

command
bundle exec rails g controller Users index

users_controller.rbとusers/index.html.erbが作成される。
その他にもjs、scss、helper、ルーティングなどが作成される。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Railsのwhere句でプレースホルダを使用する

なぜプレースホルダを使用するのか

主な理由は以下の2つです。

  1. クエリに変数を書くため
  2. SQLインジェクションを防ぐため

書き方

where句の基本形

モデル名.where(条件)

プレースホルダを使用しない記述

Category.where("name = 'fashion'")
# SELECT "categories".* FROM "categories" WHERE (name = 'fashion')

categoriesテーブルのnameカラムにfashionが入っているレコードを取得しています。

プレースホルダを使用する記述

Category.where('name = ?', 'fashion')
# SELECT "categories".* FROM "categories" WHERE (name = 'fashion')

プレースホルダの有無に関わらず、同じクエリが出力されていますね。上記の例はハードコーディングですが、変数を使用する場合は以下のような記述となります。

Category.where('name = ?', params[:category_name])

プレースホルダ+IN句の記述

Category.where('name IN (?)', ['fashion', 'vehicles', 'food'])
# SELECT "categories".* FROM "categories" WHERE (name IN ('fashion','vehicles','food'))

同カラム内でのOR検索をしたい場合、こちらの方がすっきりした記述ですね!

おまけ

ハッシュを使用して同カラムでOR検索する記述

Category.where(name: ['fashion', 'vehicles', 'food'])
# SELECT "categories".* FROM "categories" WHERE "categories"."name" IN ($1, $2, $3)  [["name", "fashion"], ["name", "vehicles"], ["name", "food"]]

こちらはプレースホルダを使用していませんが、さらに短い記述になりましたね!

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

belongs_toの効力を舐めちゃいかん。

ふとモデルをいじっていて「こいつなんでおるん?」という型に出会った。reward = product.rewards,,,のproductだ。もともとこいつがいる理由は知っていたのだが、忘れていた。そこで失礼ながら「なんでおるんや!」と投げかけてしまったのだ。

def donation_error
    reward = product.rewards.order(price: :desc).last
    errors.add(:base, "最低金額に達していません") if self.donation != nil && self.donation < reward.price
  end
class Patron < ApplicationRecord
  belongs_to :user
  belongs_to :product
  validates :donation, presence: true
  validate :donation_error
  belongs_to :reward
  has_many :notifications
  private

  def donation_error
    reward = product.rewards.order(price: :desc).last
    errors.add(:base, "最低金額に達していません") if self.donation != nil && self.donation < reward.price
  end
end

 結論

belongs_toによってメソッドが与えられてる

Railsガイドさんによると

1 belongs_toで追加されるメソッド
belongs_to関連付けを宣言したクラスでは、以下の6つのメソッドを自動的に利用できるようになります。
association
association=(associate)
build_association(attributes = {})
create_association(attributes = {})
create_association!(attributes = {})
reload_association
Railsガイドさん

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

rails[質問] データベースに画像を保存する方法

carrierwaveを使ってDBに画像のパスを保存したいのですがうまくいきません。

「状況」
gem 'carrierwave'
gem 'mini_magick'
をGemfileに記載してbundle install 済み

rails g uploader image
でimage_uploaderを作成

pictureモデルの記載は
class Picture < ApplicationRecord
mount_uploader :image, ImageUploader
belongs_to :user
end

picturesテーブルにはimageカラムstring型有り
rails db:migrate等は済んでいる

app/views/pictures/new.html.erbにて
<%= form_for(@picture, url: {controller: 'pictures', action: 'create' }) do |f| %>
<%= f.label :image %>
<%= f.file_field :image %>
<%= f.submit %>
<% end %>
というフォームを記載

関連するルーティングは
get '/newimage', to: 'pictures#new'
post '/createimage', to: 'pictures#create'

コントローラーでは
Picture.create(
image: params[:image],
user_id: current_user.id,
)

バリデーションは特にかけていません。
画像を送信するとuser_idは登録されますがimageはnilのままです。puclic以下には画像が入ります。

「やりたいこと」
DBに画像へのパスを保存して後で表示させたい

「考えていること」
user_idは保存されるので、モデルはできてそうなので、formの送信方法やルーティング設定が悪い?
:imageだとバイナリのまま?きちんとパスを渡さないとダメ?
carrierwaveの設定に何か不備がある?
この辺りかと思いガチャガチャと弄っていたのですがうまくいきません。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rails form_tagとform_withの違い

from_tagとは

投稿ページなどのフォームを実装するためのヘルパーメソッドになります。ヘルパーメソッドはrubyとして扱われるので<%= %>(erbタグ)で囲む必要があります。

HTMLのみの場合とform_tagを使用した場合の違い

<form action="/posts" method="post">
  <input type="text" name="content">
  <input type="submit" value="投稿する">
</form>

#↓form_tagの場合

<%= form_tag('/posts', method: :post) do %> 
  <input type="text" name="content"> 
  <input type="submit" value="投稿する"> 
<% end %>

form_withとは

Viewファイルで使用することで、簡単にフォームを生成することができるヘルパーメソッドになります。

<!-- form_tagを使用した例 -->
<%= form_tag('/posts', method: :post) do %>
  <input type="text" name="content">
  <input type="submit" value="投稿する">
<% end %>


<!-- form_withを使用した例 -->
<%= form_with model: @post, local: true do |form| %>
  <%= form.text_field :content %>
  <%= form.submit '投稿する' %>
<% end %>

form_withを使うメリット

・HTTPメソッドを指定する必要がない。
・コントローラーから渡された、ActiveRecordを継承するモデルのインスタンスが利用できる(上記では@postがそれに該当)
・inputタグを指定しなくて良い。

ヘルパーメソッドって

viewをシンプルにする為にあらかじめ用意されたメソッドになります。HTMLやRubyの記述がセットになった、ビューファイルで使用できるメソッドです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

can't find gem bundler (>= 0.a) with executable bundle (Gem::GemNotFoundException)の解決方法

rbenvで複数のrubyバージョンが存在する時に、bundle installを行うと、以下のエラーが発生。

can't find gem bundler (>= 0.a) with executable bundle (Gem::GemNotFoundException)

該当するrubyのバージョンを再インストールするも状況は改善されず。

いろいろと探した結果、bundlerのバージョンとGemfile.lock側のbundlerのバージョンが異なることで発生していたようなので、

$ gem install bundler -v 該当バージョン

これで、バージョンの相違を解消してあげればOK。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

なぜかid列がinteger型になっているRailsのテーブルをserial型に変更する手順

困っていたこと

ローカル環境でrails db:migrateを実行すると、何もマイグレーションを適用していないテーブルに以下のようなdiffが発生しました。(RDBMSはPostgreSQLです)

-create_table "brands", id: :serial, force: :cascade do |t|
+create_table "brands", id: :integer, default: nil, force: :cascade do |t|

原因を探ってみると、本来serial型であるべきid列のデータ型がただのinteger型になっているのが原因でした。(以下はRubyMineが生成したDDL文で確認した結果)

-- serial型なら正しい
create table brands
(
  id serial not null
    constraint brands_pkey
      primary key,

-- integer型なのはおかしい
create table brands
(
  id integer not null
    constraint brands_pkey
      primary key,

rails dbconsole(またはraild db)で\d some_tableのようにして確認するのもありです。

serial型になっている場合(sequenceが設定されている)↓

\d brands
                                        Table "public.brands"
      Column      |            Type             |                      Modifiers                      
------------------+-----------------------------+-----------------------------------------------------
 id               | integer                     | not null default nextval('brands_id_seq'::regclass)

integer型になっている場合(sequenceが設定されていない)↓

\d brands
                         Table "public.brands"
      Column      |            Type             |       Modifiers       
------------------+-----------------------------+-----------------------
 id               | integer                     | not null

なぜinteger型になっていたのかは僕もよくわかりません。
が、integer型のままでは困るので以下の手順で修正しました。

修正手順

1. 本当にserial型で正しいか確認する

念のため本番環境のデータ型を確認するなどして、本当にそのテーブルのid列がserial型でいいのかどうか確認してください。
(本番環境もinteger型だったりしたら、そっちが正になってしまいます)

2. DBのバックアップを取る

作業に失敗したときにそなえてDBのバックアップ(ダンプ)を取っておきます。

$ pg_dump your_app_development > your_app.dump

作業に失敗したときは以下のコマンドでリストアします。

$ psql -h localhost -d your_app_development < your_app.dump

3. 「次のid値」を確認する

rails dbconsoleで対象テーブルの「次のid値」を確認します。

SELECT MAX(id)+1 FROM brands;
 ?column? 
----------
        7
(1 row)

4. sequenceを設定する(=serial型に変更する)

そのまま続けて対象テーブルのid列にsequenceを設定し、dbconsoleを終了します。

-- 7は上で取得した「次のid値」
CREATE SEQUENCE brands_id_seq MINVALUE 7;
ALTER TABLE brands ALTER id SET DEFAULT nextval('brands_id_seq');
ALTER SEQUENCE brands_id_seq OWNED BY brands.id;

-- dbconsole(psql)を終了
\q

5. 動作確認

rails db:migrateを実行し、schema.rbが変更されなければ修正完了です。

もしrails db:migrate実行後にまだ以下のようなdiffが発生するようであれば、serial型に変更できていません。

-create_table "brands", id: :serial, force: :cascade do |t|
+create_table "brands", id: :integer, default: nil, force: :cascade do |t|

念のため、Rails上から対象のモデルを新しく作成したあとに正しいidが設定されていることを確認します。

# sandboxモードでrails consoleを起動
$ rails c --sandbox
> brand = Brands.new(...)
> brand.save!
> brand.id #=> 7が返ってくればOK

参考文献

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

docker-composeでpostgresqlに接続してschemaのversionを削除するまで

誤ってupされたマイグレーションファイルを削除してしまった。
他にまとまって記載されている情報が見つからなかったため記載します。

作業手順

  • コンテナ起動
  • イメージに接続
  • データベースに接続
  • scheamのレコード確認
  • 該当するversionのレコードを削除

コマンド

コンテナ起動(起動済みであれば不要)

# docker-compose up -d

起動状態の確認

# docker-compose ps
#=>      Name                    Command               State 
-------------------------------------------------------------
       hogehoge             hogehoge postgres              Up     

コンテナに入る

# sudo docker exec -it hogehoge /bin/bash

DBに接続する
usernameはdocker-compose.ymlを参照

# psql -U USERNAME

データベースの一覧を表示

# \l

データベースに接続

# \c DATABASENAME

テーブル一覧を表示

# \dt;

スキーマテーブルに入っているレコードを確認する

# select * from schema_migrations;

該当するversionを削除

delete from schema_migrations where version='NUMBER'
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

slim内に変数を埋め込むメモ

railsの変数を埋め込むメモ

- media_type = request.host.split('.')[0]

- content_for :title do
  | テスト

- content_for :page_class do
  | テスト

- content_for :head_tags do
  //端折る

div class="#{media_type}" //ここ

とあるrailsのプロジェクトで媒体ごとにclassを振り分けたかった時があったのでメモ
※(ワードプレスの各ページでclassがつくイメージ)

まとめ

個人的メモ
忘れそうだったので記述した

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

本番環境でのエラー解決を効率的に

前提

railsアプリの良いところはエラーが出てくるところです。
エラー文にはどこが間違っているのか正確に書いてあるので、
それを読み解けば大抵は問題が解決します。

しかし、デプロイして本番環境にあげた場合は別です。

例えば、次の様なエラー画面が表示されます。

The page you were looking for doesn't exist.
You may have mistyped the address or the page may have moved.
We're sorry, but something went wrong.

一つ目はまだしも、二つ目は「なんかおかしいです」と投げやりなエラー文となっており、
これだけでエラーの原因を特定するのは困難です。
もちろん、エラーログを読めば良いのですが、railsのエラー文に比べれば読み解くのが非常に大変です。

そこで、本番環境でもrailsのエラー文を表示させる方法がないか?という事を調べてみました。

実行

結論としては…簡単でした。
次のような一文があります。

config/environments/development.rb
(前略)

config.consider_all_requests_local = false

(後略)

このfalsetrueに変えてからデプロイすると、本番環境でもrailsのエラー文が表示されるようになります。
こうなれば、ローカル環境と同じようにエラー解決ができるようになるのでオススメです。

注意

本番環境はあくまで他の人に見てもらうための物なので、railsのエラー画面が表示されるのは好ましくありません。
エラーを全て解決したり、独自のエラー画面を作成した後は、falseに戻してデプロイし直すことをお勧めします。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

本番環境でのエラー解決

前提

railsアプリの良いところはエラーが出てくるところです。
エラー文にはどこが間違っているのか正確に書いてあるので、
それを読み解けば大抵は問題が解決します。

しかし、デプロイして本番環境にあげた場合は別です。

例えば、次の様なエラー画面が表示されます。

The page you were looking for doesn't exist.
You may have mistyped the address or the page may have moved.
We're sorry, but something went wrong.

一つ目はまだしも、二つ目は「なんかおかしいです」と投げやりなエラー文となっており、
これだけでエラーの原因を特定するのは困難です。
もちろん、エラーログを読めば良いのですが、railsのエラー文に比べれば読み解くのが非常に大変です。

そこで、本番環境でもrailsのエラー文を表示させる方法がないか?という事を調べてみました。

実行

結論としては…簡単でした。
次のような一文があります。

config/environments/development.rb
(前略)

config.consider_all_requests_local = false

(後略)

このfalsetrueに変えてからデプロイすると、本番環境でもrailsのエラー文が表示されるようになります。
こうなれば、ローカル環境と同じようにエラー解決ができるようになるのでオススメです。

注意

本番環境はあくまで他の人に見てもらうための物なので、railsのエラー画面が表示されるのは好ましくありません。
エラーを全て解決したり、独自のエラー画面を作成した後は、falseに戻してデプロイし直すことをお勧めします。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ruby(rails)でデータ量が多い時でもcsvファイルを比較的素早く作成する書き方

メモなので分かりにくいかもです

user_data_csv = CSV.generate do |csv|
  csv_column_names = ["名前", "年齢"]
  csv << csv_column_names

  User.all.find_each do |user|
    csv << [user.name, user.age]
  end
end

File.open("all_user_data.csv", "w") do |csv| 
  csv.puts user_data_csv
end

データをまとめてからcsvファイルに書き出してるので、こう書くより速い

CSV.open('all_user_data.csv','w') do |csv|
  csv_column_names = ["名前", "年齢"]
  csv << csv_column_names

  User.all.find_each do |user|
    csv << [user.name, user.age]
  end
end
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ruby(rails)でデータ量が多い時でもcsvファイルを比較的速く作成する書き方

メモなので分かりにくいかもです

user_data_csv = CSV.generate do |csv|
  csv_column_names = ["名前", "年齢"]
  csv << csv_column_names

  User.all.find_each do |user|
    csv << [user.name, user.age]
  end
end

File.open("all_user_data.csv", "w") do |csv| 
  csv.puts user_data_csv
end

データをまとめてからcsvファイルに書き出してるので、こう書くより速い

CSV.open('all_user_data.csv','w') do |csv|
  csv_column_names = ["名前", "年齢"]
  csv << csv_column_names

  User.all.find_each do |user|
    csv << [user.name, user.age]
  end
end

こちらにさらにいいやり方が載っていました。
https://www.techscore.com/blog/2017/12/04/fast_and_low-load_processing_method_when_exporting_csv_from_db_with_rails/

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rails6 link_toで作成したリンクをGETではなくPOSTにしたいとき

目的

  • ページ内リンクでHTTPメッセージのGETではなくPOSTを送りたい時の方法をまとめる

書き方の例

  • 考え方は簡単で、POSTを送りたいlink_toに引数として{method: "post"}を与えてあげるだけである。
  • 下記にアプリ内URLにPOSTを送る時のlink_toの記載をする、

    link_to("表示されるリンク名", "POSTを送るURL", {method: "post"})
    
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rails超絶初学者のためのデバッグ

Railsでのデバッグ

Railsを学習しはじめて2ヶ月くらいですがデバッグで困った点やありがちな点とその対象法をまとめます。
デバッグとはバグを見つけて解決することです。

よく起こるエラー

  • Syntax error

    • 書き方が間違っている時に起こるエラーです。
    • よくある原因
      • かっこを閉じていない
      • 英語のスペルミス
      • end を書いていない
  • No method error

    • そんなメソッドは存在しないというエラーです。
    • よくある原因 (eachのやつ自分でもめっちゃありました。)
      • 英語のスペルミス
      • eachを使っている時にeachで回したい内容が一つの情報しか入っていない (複数情報が前提のため)
  • argument error

    • 引数の数が違うというエラーです。
      • よくある原因
        • 4つの引数を取り扱うメソッドで引数の数が5つ以上だったり、3つ以下だったり数があっていない
  • undefined local or method 'example' ~

    • 定義されていない変数やメソッドがあるというエラーです。
      • よくある原因
        • コントローラーで定義したインスタンス変数とviewで使っているインスタンス変数が異なっている
        • コントローラーでインスタンス変数を定義していないのにviewで使っている
  • Couldn't find example id = 1

    • idが1のものが見つかりませんというエラーです。
      • よくある原因
        • 本当に存在していない
        • 存在しているのに!という時はidが1の全く別のものを探してしまっている(Userのidが1の人を探しているつもりがBookのidが1のものを探してしまっているなど)

まとめ

少しでもこれから学習する人の学びになってくれればと思って作成しました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

rails consoleでLibrary not loaded: /usr/local/opt/readline/lib/libreadline.7.dylib (LoadError)ってエラーが出る件について

まずエラー載せますね。
参考になるかもしれないのでエラーログまるごと。

YourName@YourName application_name % bundle exec rails c
Traceback (most recent call last):
    42: from bin/rails:4:in `<main>'
    41: from /Users/YourName/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activesupport-6.0.2.1/lib/active_support/dependencies.rb:325:in `require'
    40: from /Users/YourName/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activesupport-6.0.2.1/lib/active_support/dependencies.rb:291:in `load_dependency'
    39: from /Users/YourName/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activesupport-6.0.2.1/lib/active_support/dependencies.rb:325:in `block in require'
    38: from /Users/YourName/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bootsnap-1.4.5/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
    37: from /Users/YourName/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bootsnap-1.4.5/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:21:in `require_with_bootsnap_lfi'
    36: from /Users/YourName/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bootsnap-1.4.5/lib/bootsnap/load_path_cache/loaded_features_index.rb:92:in `register'
    35: from /Users/YourName/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bootsnap-1.4.5/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `block in require_with_bootsnap_lfi'
    34: from /Users/YourName/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bootsnap-1.4.5/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `require'
    33: from /Users/YourName/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/railties-6.0.2.1/lib/rails/commands.rb:18:in `<top (required)>'
    32: from /Users/YourName/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/railties-6.0.2.1/lib/rails/command.rb:44:in `invoke'
    31: from /Users/YourName/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/railties-6.0.2.1/lib/rails/command.rb:70:in `find_by_namespace'
    30: from /Users/YourName/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/railties-6.0.2.1/lib/rails/command/behavior.rb:39:in `lookup'
    29: from /Users/YourName/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/railties-6.0.2.1/lib/rails/command/behavior.rb:39:in `each'
    28: from /Users/YourName/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/railties-6.0.2.1/lib/rails/command/behavior.rb:40:in `block in lookup'
    27: from /Users/YourName/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/railties-6.0.2.1/lib/rails/command/behavior.rb:40:in `each'
    26: from /Users/YourName/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/railties-6.0.2.1/lib/rails/command/behavior.rb:44:in `block (2 levels) in lookup'
    25: from /Users/YourName/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activesupport-6.0.2.1/lib/active_support/dependencies.rb:325:in `require'
    24: from /Users/YourName/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activesupport-6.0.2.1/lib/active_support/dependencies.rb:291:in `load_dependency'
    23: from /Users/YourName/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activesupport-6.0.2.1/lib/active_support/dependencies.rb:325:in `block in require'
    22: from /Users/YourName/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bootsnap-1.4.5/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
    21: from /Users/YourName/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bootsnap-1.4.5/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:21:in `require_with_bootsnap_lfi'
    20: from /Users/YourName/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bootsnap-1.4.5/lib/bootsnap/load_path_cache/loaded_features_index.rb:92:in `register'
    19: from /Users/YourName/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bootsnap-1.4.5/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `block in require_with_bootsnap_lfi'
    18: from /Users/YourName/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bootsnap-1.4.5/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `require'
    17: from /Users/YourName/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/railties-6.0.2.1/lib/rails/commands/console/console_command.rb:4:in `<top (required)>'
    16: from /Users/YourName/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activesupport-6.0.2.1/lib/active_support/dependencies.rb:325:in `require'
    15: from /Users/YourName/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activesupport-6.0.2.1/lib/active_support/dependencies.rb:291:in `load_dependency'
    14: from /Users/YourName/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activesupport-6.0.2.1/lib/active_support/dependencies.rb:325:in `block in require'
    13: from /Users/YourName/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bootsnap-1.4.5/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
    12: from /Users/YourName/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bootsnap-1.4.5/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:21:in `require_with_bootsnap_lfi'
    11: from /Users/YourName/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bootsnap-1.4.5/lib/bootsnap/load_path_cache/loaded_features_index.rb:92:in `register'
    10: from /Users/YourName/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bootsnap-1.4.5/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `block in require_with_bootsnap_lfi'
     9: from /Users/YourName/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bootsnap-1.4.5/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `require'
     8: from /Users/YourName/.rbenv/versions/2.5.1/lib/ruby/2.5.0/irb/completion.rb:10:in `<top (required)>'
     7: from /Users/YourName/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activesupport-6.0.2.1/lib/active_support/dependencies.rb:325:in `require'
     6: from /Users/YourName/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activesupport-6.0.2.1/lib/active_support/dependencies.rb:291:in `load_dependency'
     5: from /Users/YourName/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activesupport-6.0.2.1/lib/active_support/dependencies.rb:325:in `block in require'
     4: from /Users/YourName/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bootsnap-1.4.5/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
     3: from /Users/YourName/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bootsnap-1.4.5/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:21:in `require_with_bootsnap_lfi'
     2: from /Users/YourName/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bootsnap-1.4.5/lib/bootsnap/load_path_cache/loaded_features_index.rb:92:in `register'
     1: from /Users/YourName/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bootsnap-1.4.5/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `block in require_with_bootsnap_lfi'
/Users/YourName/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bootsnap-1.4.5/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `require': dlopen(/Users/YourName/.rbenv/versions/2.5.1/lib/ruby/2.5.0/x86_64-darwin18/readline.bundle, 9): Library not loaded: /usr/local/opt/readline/lib/libreadline.7.dylib (LoadError)
  Referenced from: /Users/YourName/.rbenv/versions/2.5.1/lib/ruby/2.5.0/x86_64-darwin18/readline.bundle
  Reason: image not found - /Users/YourName/.rbenv/versions/2.5.1/lib/ruby/2.5.0/x86_64-darwin18/readline.bundle

さて、これの解決方法について調べてみると、

  1. /usr/local/opt/readline/lib に以下のファイルを、->のようにシンボリックリンクする

    • libreadline.dylib -> libreadline.dylib
    • libhistory.dylib -> libreadline.dylib
  2. 7系のreadlineを入れて、そちらを使用するようにする

  3. rb-readlineを突っ込む

などが見受けられましたが、個人的には3が影響範囲小さくて良いなと思い、そちらを選択しました。
本当はもっとちゃんと調べたかったけど、rails consoleを使いたいだけなのに、ここに時間を取られるのもアホらしいなと思ったので雑に解決。

おわりに

brew info readlineとかやっても7系のreadline出てこなかったんですが、もうインストールできないのだろうか?

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rails : turbolinksのせいでjQueryがリロードしないと動かない時の対処法

turbolinksとは

ページ遷移をAjax(非同期通信)に置き換え処理を高速化するgemです。
(Rails4からはデフォルトで入っているとのこと)

jQueryとは

JavaScriptライブラリの一種です。
アニメーションを作り出すものです。

turbolinksのせいでjQueryに支障が出る場合の対処法

application.js
//= require rails-ujs
//= require activestorage
//= require turbolinks
//= require jquery
//= require bootstrap-sprockets
//= require_tree .

$(document).on('turbolinks:load', function() {
//= この中にjQueryでの処理を書く
}

このように記述するとページを更新しなくても動くようになりました。
他にも同じような記事がいくつかあるかと思いますがシンプルにまとめました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

rails new APP_PATHで悩んだ

ほんとうに悩んだ。

c:\workspace\rails new hoge

これを実行してエラーもなく完了する。
しかし

c:\workspace\cd hoge
c:\workspace\hoge\rails new hoge
Usage:
  rails new APP_PATH [options]
(省略)

ってなった。ググると仲間が多い。

エクスプローラーでhogeの中身が物足りないことに気が付いた!

コマンドプロンプトを管理者で実行してからやり直すだけだった。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rails コーティング規約について 4

はじめに

Ruby、Railsの基礎を学習中の方に向けて記載致します。
Rubyのコーティング規約はコチラをクリック願います。
Railsのコーティング規約 2 はコチラをクリック願います。
私自身これからチーム開発を行う上で大事にしたい。知っておきたいことをOutputします。

Routing

ActiveRecordのモデル間の関連を表現するには、入れ子型でルートを定義すると分かりやすい。

qiita.rb
# 実践してみます。
class Post < ActiveRecord::Base
  has_many :comments
end

class Comments < ActiveRecord::Base
  belongs_to :post
end

# routes.rb
resources :posts do
  resources :comments
end

Bundler

  • 開発およびテストでしか利用しない gem は、Gemfileにて利用する環境(developmentやtest)を指定すること。

  • 有名で利用者の多い gem を利用すること。

    • 無名の gem を利用しなければならない場合は、利用前にソースコードをよく確認する。

さいごに

当たり前のことですが、チーム開発で欠かせないことかと思いました。
皆様の復習等にご活用頂けますと幸いです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

「The name 'Todo' is either already used in your application or reserved by Ruby on Rails. Please choose an alternative and run this generator again.」エラー対処法

$ rails g model Todo item:text
Running via Spring preloader in process 83975
      invoke  active_record
The name 'Todo' is either already used in your application or reserved by Ruby on Rails. Please choose an alternative and run this generator again.

参考ページ
https://qiita.com/tu-kun/items/4fede82431e546abd941

原因:今回作ろうとしてるRailsアプリケーションのモジュール名とモデル名が重複していたためエラーになった

1.モジュール名の変更 Todo → RailsTodo

config/application.rb
require_relative 'boot'

require 'rails/all'

# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

- module Todo
+ module RailsTodo
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 6.0

    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration can go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded after loading
    # the framework and any gems in your application.
  end
end

2.モジュール名を変更したあと、フォルダ名を変更する todo → rails_todo

  • フォルダ名はスネークケース(小文字で単語区切りが_
  • モジュール名はアッパーキャメルケース(単語区切りが大文字でそれ以外は小文字)
  • Railsにおいてアプリケーション名を表す部分はconfig/application.rbのモジュール名のことをいう

参考ページ
https://designsupply-web.com/developmentlab/4052/

エラー解消

$ rails g model Todo item:text completed:boolean
Running via Spring preloader in process 84393
      invoke  active_record
      create    db/migrate/20200216151440_create_todos.rb
      create    app/models/todo.rb
      invoke    test_unit
      create      test/models/todo_test.rb
      create      test/fixtures/todos.yml
$ rails db:migrate
== 20200216151440 CreateTodos: migrating ======================================
-- create_table(:todos)
   -> 0.0018s
== 20200216151440 CreateTodos: migrated (0.0018s) =============================
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rails モデルについて

モデルとはRailsの中でデータベースへのアクセスをはじめとする情報のやりとりに関する処理を行います。

モデルの作成

以下のコマンドで作成できる。

$ rails g model モデル名

#postモデルを作成する場合
$ rails g model post

成功すれば以下のような表示が出る

Running via Spring preloader in process 49331
      invoke  active_record
      create    db/migrate/20XXXXXXXXXXXX_create_posts.rb
      create    app/models/post.rb
      invoke    test_unit
      create      test/models/post_test.rb
      create      test/fixtures/posts.yml

app/models/post.rbが作成したpostモデルになる。また、マイグレーションファイルも作成される。

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

テーブルの設計図・仕様書のこと。どのようなテーブルにするかを記載していきます。
作成したばっかりのマイグレーションファイルは以下のようになっていると思います。

class CreatePosts < ActiveRecord::Migration[5.2]
  def change
    create_table :posts do |t|

      t.timestamps
    end
  end
end

これを以下のように編集

class CreatePosts < ActiveRecord::Migration[5.2]
  def change
    create_table :posts do |t|
      t.text :content
      t.timestamps
    end
  end

これでtext型のcontentカラムが追加される。

rails db:migrate コマンド

データベースの変更を実際にデータベースに適用するためのコマンド。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む