- 投稿日:2020-08-05T23:16:29+09:00
Puma - Nignx って環境で rails s -e production -d でうまくいかない時の逃げ道
前提
EC2 に Rails6 + Puma + Nginxでデプロイしてて
かつ EC2にSSH接続したターミナルでrails s -e productionでは問題なくサービスが表示されているのに
rails s -e production -dではエラー画面が表示されるだと?
ええ〜これじゃサービス起動させ続けるのにSSH接続しっぱなしじゃーん
という悩みを抱えたキミ向けだよ!
解決
Railsのルートフォルダにあるconfig/puma.rbに
config/puma.rbdaemonize
って追記するんだ!
これでrails s -e production -dでは起動できないままだけど
rails s -e productionこれでデーモン化されるので解決だよ!
これじゃローカルでもデーモン化されて不便だろって人は
config/puma.rbif Rails.env == 'production' daemonize endって書こうね!誰でも思いつく回避策だね!知ったげに書いてごめんね!
原因
完全に調べきったわけじゃないですが、私がネットサーファーになってgoogleの海を潜った結果、どうやら pumaで"rails s -d" でデーモン化すると puma.rbが読み込まれないみたいです。
rails s -e production -d で起動した際にNginxのエラーログにpuma.rbで設定しているsocketで接続できなかったよ!って記載されていますので、多分あってるんでないかなと思います。コイツはマズイぜ!という点があればご指摘ください!
- 投稿日:2020-08-05T22:06:40+09:00
【orderメソッド】Railsで、データの並び順を設定する
参考対象者
- Railsで、アプリ作ってるけど、あるデータの並び替えをしたいなと思っている方
特定の状況下で、データを並び替えたいとき
基本形
Model.order(Column: :DESC) Model.order("Column DESC")デフォルトでは、ASC(昇順)になっているので、DESC(降順)にすることができる
実際に、並び替えしたデータ群を取得してみる
feed_controller.rb#データベース上の全てのデータを取得 feeds = Feed.order(id: :DESC) #現在ログイン中ユーザーの全てのデータを取得 feeds = current_user.feeds.order(id: :DESC)今回は、Feedモデルというデータを取得してみた。
上は、データベース上の全てのデータを取得し、
下は、現在ログイン中ユーザーの全てのデータを取得している。こうすることで、降順になったデータ群を取得することができる。
デフォルト設定を変更して、並び替えしたいとき
モデルファイルに並び順を設定する
models/feed.rbdefault_scope -> { order(created_at: :desc) }今回も、Feedモデルというデータの並び替え設定をした。
この記法は、ラムダ関数というもので、特殊である。こうすることで、作成した日時(created_at)の降順で、並び替えするようにデフォルト設定を行うことができる。
- 投稿日:2020-08-05T21:53:31+09:00
【Railsアプリ】土台作り Part.2
【Railsアプリ】土台作り Part.1 の続きです。
Part.1でデータベースのデータ登録をrails consoleで行いましたが、実際にはデータの登録はアプリの画面で行われます。ここではアプリの画面からデータベースのデータ登録や更新を行うための準備を行います。
コントローラ作成
MVCのCです。
コントローラ名は複数形にします。ここではmenusにしています。ターミナル% bin/rails g controller menus index☆コントローラ削除
コントローラ名を間違ってしまった場合に
ターミナル% bin/rails destroy controller menusルーティング設定
〜〜〜doとendの行の間は削除して、1行追加します。これだけでいろいろなルートが設定されます。Progateと全然違うやん!!ってとまどいました。
config/routes.rbRails.application.routes.draw do resources :menus endルーティング確認
Progateの時は1行ずつパスを書いてたのに、たった1行でこれだけのルーティング設定がされました。最初はこれ見ても意味不明だったんですが、アプリを作っていく中でなんとなくわかってくると、ちょっとうれしくなります。
ターミナル% bin/rails routes menus GET /menus(.:format) menus#index POST /menus(.:format) menus#create new_menu GET /menus/new(.:format) menus#new edit_menu GET /menus/:id/edit(.:format) menus#edit menu GET /menus/:id(.:format) menus#show PATCH /menus/:id(.:format) menus#update PUT /menus/:id(.:format) menus#update DELETE /menus/:id(.:format) menus#destroyコントローラ設定基本形
とりあえずこの設定にすれば、シンプルなCRUD機能(※)を持ったアプリが作れます。
※Create(生成)、Read(読み取り)、Update(更新)、Delete(削除)
controllers/menus_controller.rbclass MenusController < ApplicationController def index @menus = Menu.all end def show @menu = Menu.find(params[:id]) end def new @menu = Menu.new end def edit @menu = Menu.find(params[:id]) end def create @menu = Menu.new(params[:menu]) if @menu.save redirect_to menus_path, notice: "作成しました" else render "new" end end def update @menu = Menu.find(params[:id]) @menu.assign_attributes(params[:menu]) if @menu.save redirect_to menus_path, notice: "更新しました" else render "edit" end end def destroy @menu = Menu.find(params[:id]) @menu.destroy redirect_to menus_path, notice: "削除しました" end endつづく
- 投稿日:2020-08-05T21:53:31+09:00
【超初心者的Railsアプリ作成】土台作り Part.2 コントローラの設定
【Railsアプリ】土台作り Part.1 の続きです。
Part.1でデータベースのデータ登録をrails consoleで行いましたが、実際にはデータの登録はアプリの画面で行われます。ここではアプリの画面からデータベースのデータ登録や更新を行うための準備を行います。
コントローラ作成
MVCのCです。
コントローラ名は複数形にします。ここではmenusにしています。ターミナル% bin/rails g controller menus index☆コントローラ削除
コントローラ名を間違ってしまった場合に
ターミナル% bin/rails destroy controller menusルーティング設定
〜〜〜doとendの行の間は削除して、1行追加します。これだけでいろいろなルートが設定されます。Progateと全然違うやん!!ってとまどいました。
config/routes.rbRails.application.routes.draw do resources :menus endルーティング確認
Progateの時は1行ずつパスを書いてたのに、たった1行でこれだけのルーティング設定がされました。最初はこれ見ても意味不明だったんですが、アプリを作っていく中でなんとなくわかってくると、ちょっとうれしくなります。
ターミナル% bin/rails routes menus GET /menus(.:format) menus#index POST /menus(.:format) menus#create new_menu GET /menus/new(.:format) menus#new edit_menu GET /menus/:id/edit(.:format) menus#edit menu GET /menus/:id(.:format) menus#show PATCH /menus/:id(.:format) menus#update PUT /menus/:id(.:format) menus#update DELETE /menus/:id(.:format) menus#destroyコントローラ設定基本形
controllers/menus_controller.rbclass MenusController < ApplicationController def index @menus = Menu.all end def show @menu = Menu.find(params[:id]) end def new @menu = Menu.new end def edit @menu = Menu.find(params[:id]) end def create @menu = Menu.new(params[:menu]) if @menu.save redirect_to menus_path, notice: "作成しました" else render "new" end end def update @menu = Menu.find(params[:id]) @menu.assign_attributes(params[:menu]) if @menu.save redirect_to menus_path, notice: "更新しました" else render "edit" end end def destroy @menu = Menu.find(params[:id]) @menu.destroy redirect_to menus_path, notice: "削除しました" end enddefの右側に書かれているindexやnewはメソッドと呼ばれます。
Part.1で Menu.new(name: "ラーメン" 〜〜〜) というコマンドでデータを登録しましたが、このコマンドのnewがまさにそれです。newはデータを新規登録するためのメソッドなので、Menuのデータベースにデータを新規登録(new)するという意味になります。他のメソッドはだいたい以下のような感じの意味です。アプリケーションの基本動作って感じがしますね。とりあえずこの設定があればアプリが作れます。
メソッド名 役割 index データの一覧表示 show データの詳細表示 edit データの編集 create newで登録したデータを保存する update editしたデータを上書き保存する destroy データを削除する つづく
- 投稿日:2020-08-05T21:53:31+09:00
【超初心者的Railsアプリ作成】土台作り Part.2
【Railsアプリ】土台作り Part.1 の続きです。
Part.1でデータベースのデータ登録をrails consoleで行いましたが、実際にはデータの登録はアプリの画面で行われます。ここではアプリの画面からデータベースのデータ登録や更新を行うための準備を行います。
コントローラ作成
MVCのCです。
コントローラ名は複数形にします。ここではmenusにしています。ターミナル% bin/rails g controller menus index☆コントローラ削除
コントローラ名を間違ってしまった場合に
ターミナル% bin/rails destroy controller menusルーティング設定
〜〜〜doとendの行の間は削除して、1行追加します。これだけでいろいろなルートが設定されます。Progateと全然違うやん!!ってとまどいました。
config/routes.rbRails.application.routes.draw do resources :menus endルーティング確認
Progateの時は1行ずつパスを書いてたのに、たった1行でこれだけのルーティング設定がされました。最初はこれ見ても意味不明だったんですが、アプリを作っていく中でなんとなくわかってくると、ちょっとうれしくなります。
ターミナル% bin/rails routes menus GET /menus(.:format) menus#index POST /menus(.:format) menus#create new_menu GET /menus/new(.:format) menus#new edit_menu GET /menus/:id/edit(.:format) menus#edit menu GET /menus/:id(.:format) menus#show PATCH /menus/:id(.:format) menus#update PUT /menus/:id(.:format) menus#update DELETE /menus/:id(.:format) menus#destroyコントローラ設定基本形
とりあえずこの設定にすれば、シンプルなCRUD機能(※)を持ったアプリが作れます。
※Create(生成)、Read(読み取り)、Update(更新)、Delete(削除)
controllers/menus_controller.rbclass MenusController < ApplicationController def index @menus = Menu.all end def show @menu = Menu.find(params[:id]) end def new @menu = Menu.new end def edit @menu = Menu.find(params[:id]) end def create @menu = Menu.new(params[:menu]) if @menu.save redirect_to menus_path, notice: "作成しました" else render "new" end end def update @menu = Menu.find(params[:id]) @menu.assign_attributes(params[:menu]) if @menu.save redirect_to menus_path, notice: "更新しました" else render "edit" end end def destroy @menu = Menu.find(params[:id]) @menu.destroy redirect_to menus_path, notice: "削除しました" end endつづく
- 投稿日:2020-08-05T21:53:31+09:00
【超初心者的】Railsアプリ作成 Part.2 コントローラの設定
【Railsアプリ】土台作り Part.1 の続きです。
Part.1でデータベースのデータ登録をrails consoleで行いましたが、実際にはデータの登録はアプリの画面で行われます。ここではアプリの画面からデータベースのデータ登録や更新を行うための準備を行います。
コントローラ作成
MVCのCです。
コントローラ名は複数形にします。ここではmenusにしています。ターミナル% bin/rails g controller menus index☆コントローラ削除
コントローラ名を間違ってしまった場合に
ターミナル% bin/rails destroy controller menusルーティング設定
〜〜〜doとendの行の間は削除して、1行追加します。これだけでいろいろなルートが設定されます。Progateと全然違うやん!!ってとまどいました。
config/routes.rbRails.application.routes.draw do resources :menus endルーティング確認
Progateの時は1行ずつパスを書いてたのに、たった1行でこれだけのルーティング設定がされました。最初はこれ見ても意味不明だったんですが、アプリを作っていく中でなんとなくわかってくると、ちょっとうれしくなります。
ターミナル% bin/rails routes menus GET /menus(.:format) menus#index POST /menus(.:format) menus#create new_menu GET /menus/new(.:format) menus#new edit_menu GET /menus/:id/edit(.:format) menus#edit menu GET /menus/:id(.:format) menus#show PATCH /menus/:id(.:format) menus#update PUT /menus/:id(.:format) menus#update DELETE /menus/:id(.:format) menus#destroyコントローラ設定基本形
controllers/menus_controller.rbclass MenusController < ApplicationController def index @menus = Menu.all end def show @menu = Menu.find(params[:id]) end def new @menu = Menu.new end def edit @menu = Menu.find(params[:id]) end def create @menu = Menu.new(params[:menu]) if @menu.save redirect_to menus_path, notice: "作成しました" else render "new" end end def update @menu = Menu.find(params[:id]) @menu.assign_attributes(params[:menu]) if @menu.save redirect_to menus_path, notice: "更新しました" else render "edit" end end def destroy @menu = Menu.find(params[:id]) @menu.destroy redirect_to menus_path, notice: "削除しました" end enddefの右側に書かれているindexやnewはメソッドと呼ばれます。
Part.1で Menu.new(name: "ラーメン" 〜〜〜) というコマンドでデータを登録しましたが、このコマンドのnewがまさにそれです。newはデータを新規登録するためのメソッドなので、Menuのデータベースにデータを新規登録(new)するという意味になります。他のメソッドはだいたい以下のような感じの意味です。アプリケーションの基本動作って感じがしますね。とりあえずこの設定があればアプリが作れます。
メソッド名 役割 index データの一覧表示 show データの詳細表示 edit データの編集 create newで登録したデータを保存する update editしたデータを上書き保存する destroy データを削除する つづく
- 投稿日:2020-08-05T21:30:09+09:00
【Railsアプリ】土台作り[1]
はじめにやることが終わったら、次は土台づくりです。このパートは何回かに記事を分けます。
モデルの作成
MVCのMです。
モデル名(modelname)は単数形にします。テーブルなどの名前は自動的に複数形で作成されます。
(ramenみたいな日本語?は複数形にならなかった。。。)ここではモデル名をmenuにしています。
ターミナル% bin/rails g model menuカラムも最初に作成したい時
ターミナル% bin/rails g model menu title:string body:text☆モデルの削除
名前を間違ってしまった場合に
コンソール% bin/rails destroy model menuテーブルの作成
自動的にファイルが作成されるので編集。カラムはname, price, descriptionの3つ。
db/migrate/20200702105514_create_menus.rbclass CreateMenus < ActiveRecord::Migration[6.0] def change create_table :XXXXX do |t| t.string :name t.integer :price t.text :descriptionマイグレーション
ターミナル% bin/rails db:migrateストロングパラメータ無効化
勉強不足で説明はできないのですが、これが有効だとDBへのデータ登録がうまくいかないことがあるので、無効にします。記載後はたしかサーバ再起動が必要だったはずです。
28行目あたり(タイムゾーン設定の下に記載しました)
config/application.rbconfig.time_zone = "Tokyo" config.action_controller.permit_all_parameters = trueテスト:データ登録
コンソールでデータ登録をしてみます。最初にrails consoleを起動します。データ登録のコマンドはProgateでやった気がします。
ターミナル% bin/rails c irb(main):001:0> menu = Menu.new(name: "ラーメン", price: 600, description: "おいしい") irb(main):002:0> menu => #<Menu id: 1, name: "ラーメン", price: 600, description: "おいしい", created_at: "2020-07-12 00:09:04", updated_at: "2020-07-12 03:25:51"> irb(main):003:0> menu.save irb(main):004:0> quit
- 投稿日:2020-08-05T21:30:09+09:00
【Railsアプリ】土台作り Part.1
【Railsアプリ】はじめにやること(超初心者) が終わったら、次は土台づくりです。このパートは何回かに記事を分けます。
まずはデータベースにデータを登録できるようにします。なお、一度にいくつも覚えられないのでバリデーションは考慮していません。
モデルの作成
MVCのMです。
モデル名は単数形にします。テーブルなどの名前は自動的に複数形で作成されます。
(ramenみたいな日本語は複数形にならなかった。。。)ここではモデル名をmenuにしています。
ターミナル% bin/rails g model menuカラムも最初に作成したい時
ターミナル% bin/rails g model menu title:string body:text☆モデルの削除
名前を間違ってしまった場合に
コンソール% bin/rails destroy model menuテーブルの作成
自動的にファイルが作成されるので編集。カラムはname, price, descriptionの3つ。
db/migrate/20200702105514_create_menus.rbclass CreateMenus < ActiveRecord::Migration[6.0] def change create_table :XXXXX do |t| t.string :name t.integer :price t.text :descriptionマイグレーション
ターミナル% bin/rails db:migrateストロングパラメータ無効化
勉強不足で説明はできないのですが、これが有効だとDBへのデータ登録がうまくいかないことがあるので、無効にします。記載後はたしかサーバ再起動が必要だったはずです。
28行目あたり(タイムゾーン設定の下に記載しました)
config/application.rbconfig.time_zone = "Tokyo" config.action_controller.permit_all_parameters = trueテスト:データ登録
コンソールでデータ登録をしてみます。最初にrails consoleを起動します。データ登録のコマンドはProgateでやった気がします。
ターミナル% bin/rails c irb(main):001:0> menu = Menu.new(name: "ラーメン", price: 600, description: "おいしい") irb(main):002:0> menu => #<Menu id: 1, name: "ラーメン", price: 600, description: "おいしい", created_at: "2020-07-12 00:09:04", updated_at: "2020-07-12 03:25:51">入力した内容が表示されたら成功です。saveしてrails consoleを終了します。
ターミナルirb(main):003:0> menu.save irb(main):004:0> quitつづく
- 投稿日:2020-08-05T21:30:09+09:00
【超初心者的Railsアプリ作成】土台作り Part.1 モデルの作成
【Railsアプリ】はじめにやること(超初心者) が終わったら、次は土台づくりです。このパートは何回かに記事を分けます。
まずはデータベースにデータを登録できるようにします。なお、一度にいくつも覚えられないのでバリデーションは考慮していません。
モデルの作成
MVCのMです。
モデル名は単数形にします。テーブルなどの名前は自動的に複数形で作成されます。
(ramenみたいな日本語は複数形にならなかった。。。)ここではモデル名をmenuにしています。
ターミナル% bin/rails g model menuカラムも最初に作成したい時
ターミナル% bin/rails g model menu title:string body:text☆モデルの削除
名前を間違ってしまった場合に
コンソール% bin/rails destroy model menuテーブルの作成
自動的にファイルが作成されるので編集。カラムはname, price, descriptionの3つ。
db/migrate/20200702105514_create_menus.rbclass CreateMenus < ActiveRecord::Migration[6.0] def change create_table :XXXXX do |t| t.string :name t.integer :price t.text :descriptionマイグレーション
ターミナル% bin/rails db:migrateストロングパラメータ無効化
勉強不足で説明はできないのですが、これが有効だとDBへのデータ登録がうまくいかないことがあるので、無効にします。記載後はたしかサーバ再起動が必要だったはずです。
28行目あたり(タイムゾーン設定の下に記載しました)
config/application.rbconfig.time_zone = "Tokyo" config.action_controller.permit_all_parameters = trueテスト:データ登録
コンソールでデータ登録をしてみます。最初にrails consoleを起動します。データ登録のコマンドはProgateでやった気がします。
ターミナル% bin/rails c irb(main):001:0> menu = Menu.new(name: "ラーメン", price: 600, description: "おいしい") irb(main):002:0> menu => #<Menu id: 1, name: "ラーメン", price: 600, description: "おいしい", created_at: "2020-07-12 00:09:04", updated_at: "2020-07-12 03:25:51">入力した内容が表示されたら成功です。saveしてrails consoleを終了します。
ターミナルirb(main):003:0> menu.save irb(main):004:0> quitつづく
- 投稿日:2020-08-05T21:30:09+09:00
【超初心者的Railsアプリ作成】土台作り Part.1
【Railsアプリ】はじめにやること(超初心者) が終わったら、次は土台づくりです。このパートは何回かに記事を分けます。
まずはデータベースにデータを登録できるようにします。なお、一度にいくつも覚えられないのでバリデーションは考慮していません。
モデルの作成
MVCのMです。
モデル名は単数形にします。テーブルなどの名前は自動的に複数形で作成されます。
(ramenみたいな日本語は複数形にならなかった。。。)ここではモデル名をmenuにしています。
ターミナル% bin/rails g model menuカラムも最初に作成したい時
ターミナル% bin/rails g model menu title:string body:text☆モデルの削除
名前を間違ってしまった場合に
コンソール% bin/rails destroy model menuテーブルの作成
自動的にファイルが作成されるので編集。カラムはname, price, descriptionの3つ。
db/migrate/20200702105514_create_menus.rbclass CreateMenus < ActiveRecord::Migration[6.0] def change create_table :XXXXX do |t| t.string :name t.integer :price t.text :descriptionマイグレーション
ターミナル% bin/rails db:migrateストロングパラメータ無効化
勉強不足で説明はできないのですが、これが有効だとDBへのデータ登録がうまくいかないことがあるので、無効にします。記載後はたしかサーバ再起動が必要だったはずです。
28行目あたり(タイムゾーン設定の下に記載しました)
config/application.rbconfig.time_zone = "Tokyo" config.action_controller.permit_all_parameters = trueテスト:データ登録
コンソールでデータ登録をしてみます。最初にrails consoleを起動します。データ登録のコマンドはProgateでやった気がします。
ターミナル% bin/rails c irb(main):001:0> menu = Menu.new(name: "ラーメン", price: 600, description: "おいしい") irb(main):002:0> menu => #<Menu id: 1, name: "ラーメン", price: 600, description: "おいしい", created_at: "2020-07-12 00:09:04", updated_at: "2020-07-12 03:25:51">入力した内容が表示されたら成功です。saveしてrails consoleを終了します。
ターミナルirb(main):003:0> menu.save irb(main):004:0> quitつづく
- 投稿日:2020-08-05T21:30:09+09:00
【超初心者的】Railsアプリ作成 Part.1 モデルの作成
【Railsアプリ】はじめにやること(超初心者) が終わったら、次は土台づくりです。このパートは何回かに記事を分けます。
まずはデータベースにデータを登録できるようにします。なお、一度にいくつも覚えられないのでバリデーションは考慮していません。
モデルの作成
MVCのMです。
モデル名は単数形にします。テーブルなどの名前は自動的に複数形で作成されます。
(ramenみたいな日本語は複数形にならなかった。。。)ここではモデル名をmenuにしています。
ターミナル% bin/rails g model menuカラムも最初に作成したい時
ターミナル% bin/rails g model menu title:string body:text☆モデルの削除
名前を間違ってしまった場合に
コンソール% bin/rails destroy model menuテーブルの作成
自動的にファイルが作成されるので編集。カラムはname, price, descriptionの3つ。
db/migrate/20200702105514_create_menus.rbclass CreateMenus < ActiveRecord::Migration[6.0] def change create_table :XXXXX do |t| t.string :name t.integer :price t.text :descriptionマイグレーション
ターミナル% bin/rails db:migrateストロングパラメータ無効化
勉強不足で説明はできないのですが、これが有効だとDBへのデータ登録がうまくいかないことがあるので、無効にします。記載後はたしかサーバ再起動が必要だったはずです。
28行目あたり(タイムゾーン設定の下に記載しました)
config/application.rbconfig.time_zone = "Tokyo" config.action_controller.permit_all_parameters = trueテスト:データ登録
コンソールでデータ登録をしてみます。最初にrails consoleを起動します。データ登録のコマンドはProgateでやった気がします。
ターミナル% bin/rails c irb(main):001:0> menu = Menu.new(name: "ラーメン", price: 600, description: "おいしい") irb(main):002:0> menu => #<Menu id: 1, name: "ラーメン", price: 600, description: "おいしい", created_at: "2020-07-12 00:09:04", updated_at: "2020-07-12 03:25:51">入力した内容が表示されたら成功です。saveしてrails consoleを終了します。
ターミナルirb(main):003:0> menu.save irb(main):004:0> quitつづく
- 投稿日:2020-08-05T20:29:34+09:00
【Rails】アプリ作成ではじめにやること
もし自分が記憶喪失になっても同じことができるよう、メモ帳に手順を書いていましたが、せっかくなので記事にしていきます。本当に記憶喪失になったらこの記事のことを見つけられるか怪しいので、トイレにでもQiitaと書いた紙を貼っておきます。
OS
Catallina 10.15.6
バージョン
コンソール% rbenv -v rbenv 1.1.2 % ruby -v ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-darwin19] % psql --version psql (PostgreSQL) 12.3PostgreSQL起動
コンソール% brew services start postgresqlアプリケーション新規作成
メールの機能は使わないのでオプションをつける
% rails new appname -d postgresql --skip-action-mailer --skip-action-mailboxデータベース設定
17行目あたり
database.ymldefault: &default adapter: postgresql encoding: unicode # For details on connection pooling, see Rails configuration guide # https://guides.rubyonrails.org/configuring.html#database-pooling pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: XXXXX password: XXXXX host: localhostデータベース作成
コンソール% bin/rails db:createタイムゾーン
27行目あたり
config/application.rbconfig.time_zone = “Tokyo”サーバ起動
コンソール% bin/rails sサーバ起動:ポートを変更したい時
コンソール% bin/rails s -p 3001サーバ起動:バックグランドで実行させたい時
コンソール% bin/rails s -dバックグラウンドで実行した場合、サーバ停止する際は puma の PID を確認して kill する。
コンソール% ps aux | grep puma XXXXX 1134 0.0 0.3 4553888 48736 s000 S+ 水08PM 1:39.24 puma 4.3.5 (tcp://localhost:3000) [appname] % kill 1134アクセス
- 投稿日:2020-08-05T20:29:34+09:00
【Railsアプリ】はじめにやること
Railsの勉強を初めて約4ヶ月(Bootstrapとかに寄り道した時期もありましたが)、自分なりにアプリを作り始めました。メモ帳に手順を書いていましたが、せっかくなので記事にしていきます。
OS
Catallina 10.15.6
バージョン
コンソール% rbenv -v rbenv 1.1.2 % ruby -v ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-darwin19] % rails -v Rails 6.0.3.2 % psql --version psql (PostgreSQL) 12.3PostgreSQL起動
コンソール% brew services start postgresqlアプリケーション新規作成
メールの機能は使わないのでオプションをつける
% rails new appname -d postgresql --skip-action-mailer --skip-action-mailboxデータベース設定
17行目あたり
database.ymldefault: &default adapter: postgresql encoding: unicode # For details on connection pooling, see Rails configuration guide # https://guides.rubyonrails.org/configuring.html#database-pooling pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: XXXXX password: XXXXX host: localhostデータベース作成
コンソール% bin/rails db:createタイムゾーン
27行目あたり
config/application.rbconfig.time_zone = “Tokyo”サーバ起動
コンソール% bin/rails sサーバ起動:ポートを変更したい時
ローカルで複数アプリを作っている場合などに
コンソール% bin/rails s -p 3001サーバ起動:バックグランドで実行させたい時
コンソール% bin/rails s -dバックグラウンドで実行した場合、サーバ停止する際は puma の PID を確認して kill する。
コンソール% ps aux | grep puma XXXXX 1134 0.0 0.3 4553888 48736 s000 S+ 水08PM 1:39.24 puma 4.3.5 (tcp://localhost:3000) [appname] % kill 1134アクセス
- 投稿日:2020-08-05T20:29:34+09:00
【Railsアプリ】はじめにやること(超初心者)
Railsの勉強を初めて約4ヶ月(Bootstrapとかに寄り道した時期もありましたが)、自分なりにアプリを作り始めました。メモ帳に手順を書いていましたが、せっかくなので記事にしていきます。
OS
Catallina 10.15.6
バージョン
コンソール% rbenv -v rbenv 1.1.2 % ruby -v ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-darwin19] % rails -v Rails 6.0.3.2 % psql --version psql (PostgreSQL) 12.3PostgreSQL起動
コンソール% brew services start postgresqlアプリケーション新規作成
メールの機能は使わないのでオプションをつける
% rails new appname -d postgresql --skip-action-mailer --skip-action-mailboxデータベース設定
17行目あたり
database.ymldefault: &default adapter: postgresql encoding: unicode # For details on connection pooling, see Rails configuration guide # https://guides.rubyonrails.org/configuring.html#database-pooling pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: XXXXX password: XXXXX host: localhostデータベース作成
コンソール% bin/rails db:createタイムゾーン
27行目あたり
config/application.rbconfig.time_zone = “Tokyo”サーバ起動
コンソール% bin/rails sポートを変更したい時。ローカルで複数アプリを作っている場合などに。
コンソール% bin/rails s -p 3001バックグランドで実行させたい時
コンソール% bin/rails s -dバックグラウンドで実行した場合、サーバ停止する際は puma の PID を確認して kill する。
コンソール% ps aux | grep puma XXXXX 1134 0.0 0.3 4553888 48736 s000 S+ 水08PM 1:39.24 puma 4.3.5 (tcp://localhost:3000) [appname] % kill 1134アクセス
- 投稿日:2020-08-05T20:29:34+09:00
【超初心者的Railsアプリ作成】はじめにやること
Railsの勉強を初めて約4ヶ月(Bootstrapとかに寄り道した時期もありました)、Progateを終えた後は参考書で勉強をしていましたがモチベーション低下してきたので、自分なりにアプリを作り始めました。これまでやってきたことをメモ帳に書いていましたが、せっかくなので記事にしていきます。
OS
Catallina 10.15.6
バージョン
コンソール% rbenv -v rbenv 1.1.2 % ruby -v ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-darwin19] % rails -v Rails 6.0.3.2 % psql --version psql (PostgreSQL) 12.3PostgreSQL起動
コンソール% brew services start postgresqlアプリケーション新規作成
メールの機能は使わないのでオプションをつける
% rails new appname -d postgresql --skip-action-mailer --skip-action-mailboxデータベース設定
17行目あたり
database.ymldefault: &default adapter: postgresql encoding: unicode # For details on connection pooling, see Rails configuration guide # https://guides.rubyonrails.org/configuring.html#database-pooling pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: XXXXX password: XXXXX host: localhostデータベース作成
コンソール% bin/rails db:createタイムゾーン
27行目あたり
config/application.rbconfig.time_zone = “Tokyo”サーバ起動
コンソール% bin/rails sポートを変更したい時。ローカルで複数アプリを作っている場合などに。
コンソール% bin/rails s -p 3001バックグランドで実行させたい時
コンソール% bin/rails s -dバックグラウンドで実行した場合、サーバ停止する際は puma の PID を確認して kill する。
コンソール% ps aux | grep puma XXXXX 1134 0.0 0.3 4553888 48736 s000 S+ 水08PM 1:39.24 puma 4.3.5 (tcp://localhost:3000) [appname] % kill 1134アクセス
- 投稿日:2020-08-05T20:29:34+09:00
【超初心者的】Railsアプリ作成 Part.0 はじめにやること
Railsの勉強を初めて約4ヶ月(Bootstrapとかに寄り道した時期もありました)、Progateを終えた後は参考書で勉強をしていましたがモチベーション低下してきたので、自分なりにアプリを作り始めました。これまでやってきたことをメモ帳に書いていましたが、せっかくなので記事にしていきます。
OS
Catallina 10.15.6
バージョン
コンソール% rbenv -v rbenv 1.1.2 % ruby -v ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-darwin19] % rails -v Rails 6.0.3.2 % psql --version psql (PostgreSQL) 12.3PostgreSQL起動
コンソール% brew services start postgresqlアプリケーション新規作成
メールの機能は使わないのでオプションをつける
% rails new appname -d postgresql --skip-action-mailer --skip-action-mailboxデータベース設定
17行目あたり
database.ymldefault: &default adapter: postgresql encoding: unicode # For details on connection pooling, see Rails configuration guide # https://guides.rubyonrails.org/configuring.html#database-pooling pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: XXXXX password: XXXXX host: localhostデータベース作成
コンソール% bin/rails db:createタイムゾーン
27行目あたり
config/application.rbconfig.time_zone = “Tokyo”サーバ起動
コンソール% bin/rails sポートを変更したい時。ローカルで複数アプリを作っている場合などに。
コンソール% bin/rails s -p 3001バックグランドで実行させたい時
コンソール% bin/rails s -dバックグラウンドで実行した場合、サーバ停止する際は puma の PID を確認して kill する。
コンソール% ps aux | grep puma XXXXX 1134 0.0 0.3 4553888 48736 s000 S+ 水08PM 1:39.24 puma 4.3.5 (tcp://localhost:3000) [appname] % kill 1134アクセス
- 投稿日:2020-08-05T19:22:53+09:00
【知識用】コントローラでよく使われる機能5つ
目次
コントローラでよく使われる機能は次の5つ
- params: https://www.sejuku.net/blog/29763
- redirect_to: https://www.sejuku.net/blog/27603
- flash: https://pikawaka.com/rails/flash
- render: https://www.sejuku.net/blog/14032
- respond_to: https://www.sejuku.net/blog/14032
paramsにまつわるもの
params(requireやpermitとのあわせ技)
送られてきた値を受け取るためのメソッド。
notes_controller.rbclass NotesController < ApplicationController def index @note = Note.all end def new @note = Note.new end def create @note = Note.new(notes_params) if @note.save redirect_to root_path else render :new end end def notes_params params.require(:note).permit(:title, :content) end endこんな感じで使う。
requireで必要なテーブルを指定して
permitで許可するカラムを指定するという感じ。
これをストロングパラメータという。redirect_toにまつわるもの
redirect_to
上記にもありますが、自動的にページを切り替えるためのメソッド。
notes_controller.rbclass NotesController < ApplicationController def create @note = Note.new(notes_params) if @note.save redirect_to root_path else render :new end end def notes_params params.require(:note).permit(:title, :content) end endこんな感じで指定したパスに自動遷移する感じ。
redirect_back
前のページに戻るためのメソッド。
notes_controller.rbclass NotesController < ApplicationController def create @note = Note.new(notes_params) if @note.save redirect_back(fallback_location: notes_path) else render :index end end def notes_params params.require(:note).permit(:title, :content) end endこんな感じで指定したパスに自動で戻る感じ。
flashに関して
flashの基本
ページ遷移時に簡易メッセージを送ることができるメソッド。
以下のキー名には、基本的にnoticeかalertを入れる。notes_controller.rbclass NotesController < ApplicationController def create @note = Note.new(notes_params) if @note.save flash[:キー名] = "表示させたいメッセージ" redirect_to root_path else render :new end end def notes_params params.require(:note).permit(:title, :content) end endflash用の部分テンプレート
layouts/_flash.html.haml.notifications - flash.each do |key, value| = content_tag(:div, value, class: key)このときのコントローラは
notes_controller.rbclass NotesController < ApplicationController def create @note = Note.new(notes_params) if @note.save redirect_to root_path, notice: "ノートが保存されました" else flash.now[:alert] = "保存できませんでした" render :new end end private def notes_params params.require(:note).permit(:title, :content) end end上記のようにredirect_toと組み合わせて使うときは特殊な書き方ができる。renderと組み合わせて使うときはflash.nowを使う。
そうすると、それぞれ一回のflash表示で済む。renderについて
renderは使い方が色々ある。
コントローラとビューで使える。
またJSONやXML形式に変換することができる。コントローラではテンプレートを呼び出す
テンプレートを呼び出す
pages_controller.rbclass PagesController < ApplicationController def index render "help" end def help end endpages_controller.rbclass PagesController < ApplicationController def index end def help end endindexのページからhelpのページに見た目が変わる。
(ただし、パスは変わらず)ビューでは部分テンプレートを呼び出す
基本バージョン
app/views/pages/_header.html.haml
app/views/pages/_footer.html.hamlを作成する。app/views/pages/index.html.haml= render 'header' %h1 %span#Pagesindex Pages#index %p Find me in app/views/pages/index.html.erb = render 'footer'変数を渡すバージョン
app/views/pages/index.html.haml= render 'header' %h1 %span#Pagesindex Pages#index %p Find me in app/views/pages/index.html.erb - @posts.each do |post| = render partial: "post" = render 'footer'このときのコントローラは
pages_controller.rbclass PagesController < ApplicationController def index @posts = Post.all end def help end endJSONやXMLといった形式を返す。
posts_controller.rbclass PostsController < ApplicationController before_action :set_post, only: [:show, :edit, :update, :destroy] # GET /posts # GET /posts.json def index @posts = Post.all respond_to do |format| format.html format.json {render :json => @posts} format.xml {render :xml => @posts} end end (以下省略)respond_toについて
上記のように記述して、JSONやXML形式で取得する。
renderと組み合わせることで使える。まとめ
以上がRailsでよく使われる機能たち。
しっかりこれらを使いこなせるようにしておこう。
- 投稿日:2020-08-05T19:12:53+09:00
掲示板投稿機能の作成の確認ポイント
自分用です!
掲示板作成時はアソシエーションを活用して、処理を短く記載していること、
・GOOD アソシエーションを活用
@board = current_user.boards.build(board_params)・BAD 初期化した後に値を代入
@board = Board.new(board_params)
@board.user_id = current_user.id・BAD 初期化する際のパラメータをmerge
Board.new(board_params.merge(user_id: current_user.id))フォームのテキストエリアの入力幅はstyleで指定するのではなく、rows:で設定すること styleは個別のHTMLに直接記載しせずに、cssファイルから適用させる形式の方が管理しやすいため
・BAD styleで高さを指定して、入力幅を設定している
<%= f.text_area :body, class: 'form-control', style: 'height: 200px', row: 10 %>・GOOD styleを使用せずに、rows:オプションで入力幅を設定している
<%= f.text_area :body, class: 'form-control', rows: 10 %>
- 投稿日:2020-08-05T19:05:23+09:00
defaults.message
自分用です!
ja.ymlのdefaults.messageに定義したものを呼び出します。
ja: defaults: login: 'ログイン' register: '登録' logout: 'ログアウト' create: '登録する' message: require_login: 'ログインしてください' created: "%{item}を作成しました" not_created: "%{item}を作成できませんでした"ja: activerecord: models: user: 'ユーザー' board: '掲示板't('defaults.message.created', item: Board.model_name.human)modelのboardから引っ張るには、Board.model_name.humanとかく。
itemという変数を定義することによって、itemの中身を変えるだけで使いまわせる。
- 投稿日:2020-08-05T18:53:18+09:00
【勉強用】Apacheとかnginxとかunicornとかpassengerとか(おまけにリバプロ)
勉強用
自己学習の為にQiitaに残していきたい
Webアプリケーションの流れ
静的なサービス
- Webブラウザのリクエストに対して、Webサーバが結果を返す
- webブラウザ ⇄ Webサーバ
動的なサービス
- Webブラウザのリクエストに対して、Webサーバがアプリケーションサーバにリクエストを送り、返ってきた結果をwebブラウザに返す
- Webブラウザ ⇄ webサーバ ⇄ アプリケーションサーバ ⇄ アプリケーション
- Webブラウザのリクエストに対して、webサーバがモジュールを通してプログラムを実行し、返ってきた結果をWebサーバに返す
- Webブラウザ ⇄ Webサーバ(モジュール) ⇄ アプリケーション
Webサーバ
例)Apache、nginx
アプリケーションサーバ
Webサーバから受け取ったリクエストを元に、Rubyなどを実行し、Webサーバに結果を返す
例)unicorn、Puma※passengerは?
Apacheやnginxのようなwebサーバに組み込んで使えるモジュール。
Railsアプリケーションを動かすためにアプリケーションサーバを用意する必要がない。からのプロキシとリバプロ
プロキシ(webブラウザのパシリ)
1.Webブラウザ→「俺の代わりにこのページ貰ってきておくれ」→プロキシサーバ
2.プロキシサーバ→「このページおくれ」→Webサーバ
3.プロキシサーバ←「ほれ、そのページだよ」←Webサーバ
4.Webブラウザ←「ほれ、貰ってきたページだよ」←プロキシサーバリバースプロキシ(webサーバのパシリ)
1.Webブラウザ→「このページおくれ」→リバースプロキシサーバ
2.リバースプロキシサーバ→「このページをくれってきたよ」→Webサーバ
3.リバースプロキシサーバ←「じゃあ、このページ返してあげて」←Webサーバ
4.Webブラウザ←「ほれ、そのページだよ」←リバースプロキシサーバリバプロを使うメリット
身元を隠せる
負荷分散ができる参考
ピヨ太くんでおなじみの
https://wa3.i-3-i.info/word1755.html
- 投稿日:2020-08-05T18:51:27+09:00
refileのattachment_image_tagで画像がうまく表示されない場合に
この記事について
画像を表示させるためにrefileのattachment_image_tagで画像が表示されない時があって、いろいろ調べて試行錯誤した結果安定して?表示されるようになったので投稿
問題のエラー
白い雲と青い空、そして可愛らしい山を描いた画像で癒されそうだが、こいつは精神を破壊させてくる悪魔の画像。
この悪魔が表示されていた時のコードは以下の通りqiita.rb<%= attachment_image_tag [_idを除いたカラム名], :image, :fill, 横幅数値, 縦幅数値, format: '識別子(jpegなど)' %>僕の場合の解決法
attachment_image_tagの
fill
の書き方を変更した。qiita.rb# 変更前 <%= attachment_image_tag [_idを除いたカラム名], :image, :fill, 横幅数値, 縦幅数値, format: '識別子(jpegなど)' %> # 変更後 <%= attachment_image_tag [_idを除いたカラム名], :image, size: "横幅数値x縦幅数値", format: '(jpegなど)' %>どうやら
fill
が悪さをしていて、画像の大きさを指定するためにsize
を使用してみると忌々しい悪魔の画像が表示されないようになった。https://github.com/refile/refile
公式を見てみも
size: "横幅数値x縦幅数値"
で書いてる様子はなく、これでなぜ上手くいってるのかが良く分かっていない。
多分根本的な解決にはなっていないから、判明次第編集しまっす。
- 投稿日:2020-08-05T17:11:30+09:00
Railsのルーティングついて
概要
Railsアプリケーションでのルーティングについてまとめました。
今回のゴール
『ルーティングの効果』と『実践的な使い方』を確認することです。
<1>ルーティングの効果
結論
・HTTPリクエストをもとに、コントローラーとアクションに処理を渡せるようになる。
・ヘルパーメソッドにより、コントローラーやビューでパスとURIを作成できるようになる。コントローラーとアクションの指定方法
ルーティングではクライアントからのHTTPリクエストを下記のコードで振り分けます。
ルーティングのイメージ[HTTPメソッド] '[URIのパス]', to: '[コントローラー名]#[アクション名]' 例) get 'samples', to: 'samples#index'つまり、今回の例ですと...
クライアントから『GETメソッド』で『samplesのパス』でアクセスがきたら
Railsアプリケーションの『samplesコントローラー』の『indexアクション』で処理をしますという意味になります。
コントローラーやビューでパスとURLヘルパーが使えるようになる
ルーティングが記述されることにより、Railsアプリケーション内で『_pathメソッド』・『_urlメソッド』使えるようになります。
このメソッドにより、コントローラーでのredirect_toメソッドやビューのlink_toメソッドなどがpathを使って記述できるようになります。_pathメソッド ・ _urlメソッド
『[Prefix]_path』や『[Prefix]_url』のように使うことで、簡単にパスやURL生成するヘルパーメソッドです。
※ Prefixについては後ほど、説明します。
<2> 実践的な使い方
ルーティングの設定場所
config/routes.rb
ファイルになります。config/routes.rbRails.application.routes.draw do get 'samples', to: 'samples#index' endルーティングの確認方法
ターミナルを使い、アプリケーションのディレクトリで
rails routes
とコマンドを実行すると確認できます。ターミナル(アプリケーションのディレクトリ)$ rails routes Prefix Verb URI Pattern Controller#Action samples GET /samples(.:format) samples#index『Prefix』・『Verb』・『URI Pattern』・『Controller#Action』の四つの項目が表示されます。
『VerbとURI Pattern』の組み合わせで、HTTPリクエスト内容を判断して
『Controller#Action』で処理を渡す先を示しています。Prefixとは
『_pathメソッド』・『_urlメソッド』を使う際に利用される、変数のようなものです。
例)samples_path => " /samples "
samples_url => " http://sample.com/samples "Verb(HTTP動詞)とは
処理判断するHTTPメソッドになります。
URI Patternとは
処理判断するURIのパスになります。
Controller#Actionとは
処理を渡すコントローラー名とアクション名になります。
基本の7種類のアクション
Railsには標準的に使う『7種類のアクション』が設定されています。
アクション名 使用目的 index 一覧表示する new 新規のデータフォームを表示する create 新規データを登録する show 特定のデータを表示する edit 特定データの編集フォームを表示する update 特定データを更新する destroy 特定データを削除する 基本的なルーティングの記述方法
大きく分けると2つに分けることが出来ます。
『個別設定』と『一括設定』です。個別設定
ルーティングを1行ずつ設定するコードなります。
Rails.application.routes.draw do get 'samples', to: 'samples#index' post 'samples', to: 'samples#create' put 'samples/:id', to: 'samples#update' end一括設定(リソースベースなルーティング)
複数のルーティング設定を短いコードで書くことが出来ます。
resources (複数形リソース)
1行で7つのアクションのルーティング設定が可能なコードです。
Rails.application.routes.draw do resources :samples end以下の個別設定ルーティングと同じ
Rails.application.routes.draw do get 'samples', to: 'samples#index' post 'samples', to: 'samples#create' get 'samples/new', to: 'samples#new', as: 'new_sample' get 'samples/:id/edit', to: 'samples#edit', as: 'edit_sample' get 'samples/:id', to: 'samples#show', as: 'sample' patch 'samples/:id', to: 'samples#update' put 'samples/:id', to: 'samples#update' delete 'samples/:id', to: 'samples#destroy' end※ asオプション
『as: 'XXX'』とすることで、Prefixに『XXX』と指定することが出来ます。
resource (単数形リソース)
1行でindexアクション以外の6つのアクションのルーティング設定が可能なコードです。
アプリケーション設計の中で、各ユーザーがひとつの情報(リソース)しか持たない時に使います。
ひとつの情報しか持たないため、indexアクション(複数リソースを一覧表示する)がなく
URIのパスに『:id』がつきません。また、コントローラーは複数形になることに注意が必要です。
Rails.application.routes.draw do resource :sample # 単数形になっている end以下の個別設定ルーティングと同じ
Rails.application.routes.draw do post 'sample', to: 'samples#create' get 'sample/new', to: 'samples#new', as: 'new_sample' get 'sample/edit', to: 'samples#edit', as: 'edit_sample' get 'sample', to: 'samples#show', as: 'sample' patch 'sample', to: 'samples#update' put 'sample', to: 'samples#update' delete 'sample', to: 'samples#destroy' end応用的なルーティングの記述方法
リソースベースなルーティングの制限
resources/resourceのルーティングのアクションを一部を使用したい時に
『onlyオプション』・『exceptオプション』を指定します。Rails.application.routes.draw do # index・showアクションのみを使用 resources :users, only: [:index, :show] # index・show・edit・update・destroyアクション以外を使用 resources :books, except: [:index, :show, :edit, :update , :destroy] end$ rails routes Prefix Verb URI Pattern Controller#Action users GET /users(.:format) users#index user GET /users/:id(.:format) users#show books POST /books(.:format) books#create new_book GET /books/new(.:format) books#newリソースベースなルーティングに対して、アクションの追加
Railsの7つ基本的なアクション以外にも、『memberルーティング』・『collectionルーティング』でアクションを追加することができます。
memberルーティングとは
URIのパスに『:id』を含んだルーティング方法です。
memberルーティングRails.application.routes.draw do resources :photos do member do get 'preview' end end end$ rails routes Prefix Verb URI Pattern Controller#Action preview_photo GET /photos/:id/preview(.:format) photos#preview photos GET /photos(.:format) photos#indexcollectionルーティングとは
URIのパス『:id』を含まないルーティング方法です。
コードの記述方法は、memberルーティングと同じです。URIのパスの『:id』の有無で何が変わるのか
『id』とはアプリケーション内で登録したデータの管理番号です。
パスに『id』があるということは、『そのアクションを実行する時に、管理番号で必要なデータを特定している』ということになります。例えばRailsの7つの基本アクションで説明すると
index・new・createアクションにはパスに『id』がありません。
なぜかというと、一覧表示するために特定のデータはいらないですし、これから登録するデータには『id』がないからです。その逆に、show・edit・update・destroyアクションは
登録された特定のデータを表示したり、変更したり、削除したりするので
『id』がないとどのデータのことかわからないため、パスに『id』が入っています。ネストしたリソースのルーティング
ネストとは
『入れ子』という意味です。
ルーティングに親要素の中に入れ子構造で子要素を入れて記述することを表します。例)ネストしたリソースのルーティングRails.application.routes.draw do resources :books do resources :reviews end end今回の例だと、booksという親要素に、reviewsという子要素が入れ子構造になっています。
ルーティングへの効果
ネストしたルーティングすることによって、子要素のルーティングに親要素を関連付けることができます。
上記の例の場合だと、必ずreviews(子要素)はある特定のbook(親要素)に結びついていることになります。
reviews(子要素)のルーティングを確認するとこうなります。Prefix Verb URI Pattern Controller#Action book_reviews GET /books/:book_id/reviews(.:format) reviews#index POST /books/:book_id/reviews(.:format) reviews#create new_book_review GET /books/:book_id/reviews/new(.:format) reviews#new edit_book_review GET /books/:book_id/reviews/:id/edit(.:format) reviews#edit book_review GET /books/:book_id/reviews/:id(.:format) reviews#show PATCH /books/:book_id/reviews/:id(.:format) reviews#update PUT /books/:book_id/reviews/:id(.:format) reviews#update DELETE /books/:book_id/reviews/:id(.:format) reviews#destroy『Prefix』と『URI Pattern』の項目にネストの効果があります。
Prefix への効果
子要素の前に親要素が入ります。
book_reviews
やnew_book_review
などの親要素(book)が入ったPrefixになります。URI Pattern への効果
子要素の前に親要素と親要素のidが入ります。
/books/:book_id/reviews
という親要素(book)が入ったURI Patternになります。
/books/:book_id
の部分が特定の親要素を表すパスとなり
『子要素がどの親要素とつながりがあるか』が明示的に示されるようになります。以上になります。
- 投稿日:2020-08-05T16:30:08+09:00
【知識用】Railsのルーティングを極める【基本と応用】
基本編
7つのアクションはresourcesで
routes.rbRails.application.routes.draw do resources :notes end限定したいときはonlyとexceptを使う
routes.rbRails.application.routes.draw do resources :notes, only: [:index, :show] endroutes.rbRails.application.routes.draw do resources :tweets, except: [:new, :create, :edit, :update, :destroy] endonlyはホワイトリスト系
exceptはブラックリスト系users/1/notesとしたいときはネスト
routes.rbRails.application.routes.draw do resources :users do resources :notes end end7つのアクション以外は次の2通り
routes.rbRails.application.routes.draw do resources :notes do member do get 'review' end end endroutes.rbRails.application.routes.draw do resources :notes do collection do get 'search' end end endmemberはidで指定した特定のリソースに対するアクション
collectionは全体のリソースに対するアクション
をそれぞれ定義する。応用編
単純なページならresourceで
routes.rbRails.application.routes.draw do resource :notes endこれはindexアクションとidが必要ないときに有効。
パスをグループ化したいときはnamespaceを使う
routes.rbRails.application.routes.draw do namespace :admin do resources :users end endルートパスの指定方法はrootで
routes.rbRails.application.routes.draw do root 'notes#index' endまとめ
以上Railsのルーティングのまとめでした。
たったこれだけなんですね!もう少し単純にまとめられそうに思いました。
あとは機能別にまとめていくのもいいかもしれないと思いました。
例えば商品出品機能とか。
基本の型を作る感じ。
- 投稿日:2020-08-05T16:21:16+09:00
Railsでの複数カラムの追加・削除とまとめて行う方法
自分用です!
複数のカラム追加していきます。
まずはマイグレーションファイルを作ります。
ターミナルrails g migration add_columns_to_users複数のカラムを追加する際、特定のカラムを意識するわけでもない場合は「add_columns」などとしておけばいいでしょう。
class AddColumnsToUsers < ActiveRecord::Migration[5.2] def change add_column :users, :last_name, :string add_column :users, :first_name, :string end endrails db:migrateをすれば追加される。
- 投稿日:2020-08-05T16:14:27+09:00
EC2にデプロイしたアプリケーションからシークレットキーを生成できない
- 投稿日:2020-08-05T16:13:39+09:00
sorceryを使用して、ユーザー機能を作成する
自分用です!!
sorceryを使ってログイン機能を作成していきます。
sorceryをインストール
Gemfilegem sorcerybundele installします。
ここで、生成されるpasswordとpassword_confirmationはcrypted_passwordカラムに対する仮想属性となっています。
user.rbにif: -> { new_record? || changes[:crypted_password] }が記載されています。
これにより、登録したユーザーがパスワード以外のプロフィール項目を更新したい場合に、パスワードの入力を省略させることができます。ajax通信にしない場合、
form_withでは、local: trueが指定されていること。ログインしているか、の判定では、<% if current_user %>ではなく、sorceryで使える、
<% if logged_in %>を使っていく。新規登録ページのルーティングにはresourcesを使う。
routes.rbresources :users, only: %i[new create]user_sessions controllerでは、newアクションと、createアクションを作成
ここでは、loginというsorceryで使えるメソッドを使いログインします。user_sessions_controller.rbdef create @user = login(params[:email], params[:password]) if @user redirect_back_or_to root_path else render :new end end
- 投稿日:2020-08-05T15:39:41+09:00
【コピペ用】Railsの7つのアクションについてまとめた。【基本の型】
HTTPメソッドとCRUDの関係性
処理 HTTPメソッド CRUD操作 登録 POST CREATE 取得 GET READ 更新 PUT UPDATE 削除 DELETE DELETE ルーティングとコントローラの関係
resources :notes 定義すれば
HTTP動詞 パス コントローラ#アクション 目的 GET /notes notes#index 一覧表示ページ GET /notes/new notes#new 作成のためのページ POST /notes notes#create 作成したものを保存する GET /notes/:id notes#show 詳細表示ページ GET /notes/:id/edit notes#edit 編集のためのページ PATCH/PUT /notes/:id notes#update 編集したものを更新する DELETE /notes/:id notes#destroy 詳細表示したものを削除する コントローラにおける各アクションの変数定義
これはscaffoldでコントローラを作成したときと同じもの。
notes_controller.rbclass NotesController < ApplicationController def index @notes = Note.all end def new @note = Note.new end def create @note = Note.new(note_params) if @note.save 保存が成功したときの記述 else 保存が失敗したときの記述 end end def show @note = Note.find(params[:id]) end def edit @note = Note.find(params[:id]) end def update @note = Note.find(params[:id]) if @note.update_attributes(note_params) 更新が成功したときの記述 else 更新が失敗したときの記述 end end def destroy @note = Note.find(params[:id]) @note.destory end private def note_params params.require(:note).permit(:title, :content) end end ##まとめ あまりまとめる必要はないかなと思いましたが 迷ったときに見直したいと思います!
- 投稿日:2020-08-05T15:22:46+09:00
Could not find generator 'uploader'. を解決する(Railsチュートリアル13章)
自分がrailsチュートリアルを進めていく上で、発生したエラーを記録していきます。
ハードはMacBook Air, 開発環境はVScodeを用いています。発生しているエラー
Railsチュートリアル13章 13.4.1
$ rails generate uploader Picture Could not find generator 'uploader'. Maybe you meant 'helper', 'jbuilder' or 'model' Run `rails generate --help` for more options.解決方法
以下を実行。
$ bin/spring stop参考:https://stackoverflow.com/questions/41000064/rails-5-carrierwave-could-not-find-generator-uploader
役に立ったら是非LGTMボタンをポチッと押していただけると嬉しいです。
一緒に Rails学習 頑張りましょう!
- 投稿日:2020-08-05T14:46:46+09:00
activerecord-importでUpdateする方法
微妙に書いてなかったので自分用にメモ
update_users = [] users.each do |user| user.name = "John" user.email = "test@mail.com" update_users << user end # ここのon_duplicate_key_updateに更新したい列名を渡す User.import update_users, on_duplicate_key_update: [:name, :email]GemのデフォルトはINSERTをする用途で
on_duplicate_key_update
オプションで列名を指定してあげることでキーが被ったときに指定した列が更新される(Upsertされる)という理解をした。なので元々あるユーザーだけを更新して渡せばUpdateだけされるという感じ。
ちなみにDBによってこのオプションの指定の仕方は違うらしい
https://github.com/zdennis/activerecord-import/#duplicate-key-update# MySQL version Book.import [book], on_duplicate_key_update: [:title] # PostgreSQL version Book.import [book], on_duplicate_key_update: {conflict_target: [:id], columns: [:title]}
- 投稿日:2020-08-05T14:42:21+09:00
rspec spec時のNameError: undefined local variable or method `config' for main:Objectの対処法
rails5中級チュートリアル中のテスト実行時に起こったエラー
エラー文
ターミナル#rsepc spec 実行時 NameError: undefined local variable or method `config' for main:Object原因と解決
rails_helper.rbへgemメソッドを使えるようにする記述の記述場所が誤っていた。
rails_helper.rb下記の記述をRSpec.configure do |config|の中に記述していなかったのが原因 config.include Devise::Test::IntegrationHelpers, type: :feature config.include FactoryBot::Syntax::Methods Capybara.javascript_driver = :poltergeist Capybara.server = :pumaこれでもう一度テストを実行すると...
ターミナルFinished in 0.17382 seconds (files took 5.23 seconds to load) 2 examples, 0 failures無事成功?
反省
今回のエラーで1時間ほど時間を食ってしまった。中級チュートリアルの記事をよく見返すと今回の原因が書いてあったので、以後チュートリアルを進める際は、細部まで目を通すことを心がける。