- 投稿日:2020-02-17T22:38:26+09:00
[Rails] Params
Paramsメソッドとは
Railsで送られたきたパラメーターを受け渡しするメソッドです。主にコントローラーに記載します。
例: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 endform_tagとform_withでの記載の違い
# form_tagを使用した時のストロングパラメーター def post_params params.permit(`カラム名`) end # form_withを使用した時ストロングパラメーター def post_params params.require(`モデル名`).permit(`カラム名`) endform_withの場合はrequireをつける。
findを使う場合
def show @post = Post.find(params[:id]) end
- 投稿日:2020-02-17T22:25:51+09:00
Rails_マイグレーション関連
モデル作成(create_table)
commandbundle exec rails g model UserUser.rbとマイグレーションファイルが作成される。
create_users.rbclass 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カラム追加、削除、変更
commandbundle exec rails g migration change_columns_to_users(※適当なファイル名)change_columns_to_users.rbclass 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マイグレーション実行
commandbundle exec rails db:migrate or bundle exec rake db:migrateコントローラ作成
commandbundle exec rails g controller Users indexusers_controller.rbとusers/index.html.erbが作成される。
その他にもjs、scss、helper、ルーティングなどが作成される。
- 投稿日:2020-02-17T22:23:03+09:00
Railsのwhere句でプレースホルダを使用する
なぜプレースホルダを使用するのか
主な理由は以下の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"]]こちらはプレースホルダを使用していませんが、さらに短い記述になりましたね!
参考
- 投稿日:2020-02-17T21:36:29+09:00
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 endclass 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ガイドさん
- 投稿日:2020-02-17T21:32:50+09:00
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
endpicturesテーブルには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の設定に何か不備がある?
この辺りかと思いガチャガチャと弄っていたのですがうまくいきません。
- 投稿日:2020-02-17T21:06:15+09:00
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の記述がセットになった、ビューファイルで使用できるメソッドです。
- 投稿日:2020-02-17T19:11:01+09:00
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。
- 投稿日:2020-02-17T19:09:36+09:00
なぜか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.dump3. 「次の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)を終了 \q5. 動作確認
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参考文献
- 投稿日:2020-02-17T18:10:54+09:00
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/bashDBに接続する
usernameはdocker-compose.yml
を参照# psql -U USERNAMEデータベースの一覧を表示
# \lデータベースに接続
# \c DATABASENAMEテーブル一覧を表示
# \dt;スキーマテーブルに入っているレコードを確認する
# select * from schema_migrations;該当するversionを削除
delete from schema_migrations where version='NUMBER'
- 投稿日:2020-02-17T15:40:45+09:00
slim内に変数を埋め込むメモ
- 投稿日:2020-02-17T13:18:24+09:00
本番環境でのエラー解決を効率的に
前提
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 (後略)この
false
をtrue
に変えてからデプロイすると、本番環境でもrailsのエラー文が表示されるようになります。
こうなれば、ローカル環境と同じようにエラー解決ができるようになるのでオススメです。注意
本番環境はあくまで他の人に見てもらうための物なので、railsのエラー画面が表示されるのは好ましくありません。
エラーを全て解決したり、独自のエラー画面を作成した後は、false
に戻してデプロイし直すことをお勧めします。
- 投稿日:2020-02-17T13:18:24+09:00
本番環境でのエラー解決
前提
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 (後略)この
false
をtrue
に変えてからデプロイすると、本番環境でもrailsのエラー文が表示されるようになります。
こうなれば、ローカル環境と同じようにエラー解決ができるようになるのでオススメです。注意
本番環境はあくまで他の人に見てもらうための物なので、railsのエラー画面が表示されるのは好ましくありません。
エラーを全て解決したり、独自のエラー画面を作成した後は、false
に戻してデプロイし直すことをお勧めします。
- 投稿日:2020-02-17T13:00:44+09:00
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
- 投稿日:2020-02-17T13:00:44+09:00
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/
- 投稿日:2020-02-17T11:56:46+09:00
Rails6 link_toで作成したリンクをGETではなくPOSTにしたいとき
- 投稿日:2020-02-17T11:43:42+09:00
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のものを探してしまっているなど)
まとめ
少しでもこれから学習する人の学びになってくれればと思って作成しました。
- 投稿日:2020-02-17T11:23:27+09:00
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さて、これの解決方法について調べてみると、
/usr/local/opt/readline/lib に以下のファイルを、->のようにシンボリックリンクする
- libreadline.dylib -> libreadline.dylib
- libhistory.dylib -> libreadline.dylib
7系のreadlineを入れて、そちらを使用するようにする
rb-readlineを突っ込む
などが見受けられましたが、個人的には3が影響範囲小さくて良いなと思い、そちらを選択しました。
本当はもっとちゃんと調べたかったけど、rails console
を使いたいだけなのに、ここに時間を取られるのもアホらしいなと思ったので雑に解決。おわりに
brew info readline
とかやっても7系のreadline出てこなかったんですが、もうインストールできないのだろうか?
- 投稿日:2020-02-17T11:17:36+09:00
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での処理を書く }このように記述するとページを更新しなくても動くようになりました。
他にも同じような記事がいくつかあるかと思いますがシンプルにまとめました。
- 投稿日:2020-02-17T11:11:13+09:00
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の中身が物足りないことに気が付いた!
コマンドプロンプトを管理者で実行してからやり直すだけだった。
- 投稿日:2020-02-17T10:31:31+09:00
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 endBundler
開発およびテストでしか利用しない gem は、Gemfileにて利用する環境(developmentやtest)を指定すること。
有名で利用者の多い gem を利用すること。
- 無名の gem を利用しなければならない場合は、利用前にソースコードをよく確認する。
さいごに
当たり前のことですが、チーム開発で欠かせないことかと思いました。
皆様の復習等にご活用頂けますと幸いです。
- 投稿日:2020-02-17T09:49:17+09:00
「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.rbrequire_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 end2.モジュール名を変更したあと、フォルダ名を変更する 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) =============================
- 投稿日:2020-02-17T00:20:17+09:00
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.ymlapp/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 コマンド
データベースの変更を実際にデータベースに適用するためのコマンド。