20200805のRailsに関する記事は30件です。

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.rb
daemonize

って追記するんだ!
これで

rails s -e production -d

では起動できないままだけど

rails s -e production 

これでデーモン化されるので解決だよ!

これじゃローカルでもデーモン化されて不便だろって人は

config/puma.rb
if Rails.env == 'production'
  daemonize
end

って書こうね!誰でも思いつく回避策だね!知ったげに書いてごめんね!

原因

完全に調べきったわけじゃないですが、私がネットサーファーになってgoogleの海を潜った結果、どうやら pumaで"rails s -d" でデーモン化すると puma.rbが読み込まれないみたいです。
rails s -e production -d で起動した際にNginxのエラーログにpuma.rbで設定しているsocketで接続できなかったよ!って記載されていますので、多分あってるんでないかなと思います。

コイツはマズイぜ!という点があればご指摘ください!

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

【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.rb
default_scope -> { order(created_at: :desc) }

今回も、Feedモデルというデータの並び替え設定をした。
この記法は、ラムダ関数というもので、特殊である。

こうすることで、作成した日時(created_at)の降順で、並び替えするようにデフォルト設定を行うことができる。

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

【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.rb
Rails.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.rb
class 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

つづく

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

【超初心者的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.rb
Rails.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.rb
class 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

defの右側に書かれているindexやnewはメソッドと呼ばれます。
Part.1で Menu.new(name: "ラーメン" 〜〜〜) というコマンドでデータを登録しましたが、このコマンドのnewがまさにそれです。newはデータを新規登録するためのメソッドなので、Menuのデータベースにデータを新規登録(new)するという意味になります。

他のメソッドはだいたい以下のような感じの意味です。アプリケーションの基本動作って感じがしますね。とりあえずこの設定があればアプリが作れます。

メソッド名 役割
index データの一覧表示
show データの詳細表示
edit データの編集
create newで登録したデータを保存する
update editしたデータを上書き保存する
destroy データを削除する

つづく

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

【超初心者的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.rb
Rails.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.rb
class 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

つづく

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

【超初心者的】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.rb
Rails.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.rb
class 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

defの右側に書かれているindexやnewはメソッドと呼ばれます。
Part.1で Menu.new(name: "ラーメン" 〜〜〜) というコマンドでデータを登録しましたが、このコマンドのnewがまさにそれです。newはデータを新規登録するためのメソッドなので、Menuのデータベースにデータを新規登録(new)するという意味になります。

他のメソッドはだいたい以下のような感じの意味です。アプリケーションの基本動作って感じがしますね。とりあえずこの設定があればアプリが作れます。

メソッド名 役割
index データの一覧表示
show データの詳細表示
edit データの編集
create newで登録したデータを保存する
update editしたデータを上書き保存する
destroy データを削除する

つづく

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

【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.rb
class 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.rb
    config.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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【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.rb
class 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.rb
    config.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

つづく

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

【超初心者的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.rb
class 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.rb
    config.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

つづく

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

【超初心者的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.rb
class 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.rb
    config.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

つづく

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

【超初心者的】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.rb
class 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.rb
    config.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

つづく

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

【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.3

PostgreSQL起動

コンソール
% brew services start postgresql

アプリケーション新規作成

メールの機能は使わないのでオプションをつける

% rails new appname -d postgresql --skip-action-mailer --skip-action-mailbox

データベース設定

17行目あたり

database.yml
default: &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.rb
config.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

アクセス

http://localhost:3000/

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

【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.3

PostgreSQL起動

コンソール
% brew services start postgresql

アプリケーション新規作成

メールの機能は使わないのでオプションをつける

% rails new appname -d postgresql --skip-action-mailer --skip-action-mailbox

データベース設定

17行目あたり

database.yml
default: &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.rb
config.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

アクセス

http://localhost:3000/

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

【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.3

PostgreSQL起動

コンソール
% brew services start postgresql

アプリケーション新規作成

メールの機能は使わないのでオプションをつける

% rails new appname -d postgresql --skip-action-mailer --skip-action-mailbox

データベース設定

17行目あたり

database.yml
default: &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.rb
config.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

アクセス

http://localhost:3000/

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

【超初心者的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.3

PostgreSQL起動

コンソール
% brew services start postgresql

アプリケーション新規作成

メールの機能は使わないのでオプションをつける

% rails new appname -d postgresql --skip-action-mailer --skip-action-mailbox

データベース設定

17行目あたり

database.yml
default: &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.rb
config.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

アクセス

http://localhost:3000/

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

【超初心者的】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.3

PostgreSQL起動

コンソール
% brew services start postgresql

アプリケーション新規作成

メールの機能は使わないのでオプションをつける

% rails new appname -d postgresql --skip-action-mailer --skip-action-mailbox

データベース設定

17行目あたり

database.yml
default: &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.rb
config.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

アクセス

http://localhost:3000/

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

【知識用】コントローラでよく使われる機能5つ

目次

コントローラでよく使われる機能は次の5つ

paramsにまつわるもの

params(requireやpermitとのあわせ技)

送られてきた値を受け取るためのメソッド。

notes_controller.rb
class 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.rb
class 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.rb
class 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.rb
class 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

end

flash用の部分テンプレート

layouts/_flash.html.haml
.notifications
  - flash.each do |key, value|
    = content_tag(:div, value, class: key)

このときのコントローラは

notes_controller.rb
class 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.rb
class PagesController < ApplicationController
  def index
    render "help"
  end

  def help
  end

end
pages_controller.rb
class PagesController < ApplicationController
  def index
  end

  def help
  end

end

indexのページから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.rb
class PagesController < ApplicationController
  def index
    @posts = Post.all
  end

  def help
  end
end

JSONやXMLといった形式を返す。

posts_controller.rb
class 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でよく使われる機能たち。
しっかりこれらを使いこなせるようにしておこう。

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

掲示板投稿機能の作成の確認ポイント

自分用です!

掲示板作成時はアソシエーションを活用して、処理を短く記載していること、

・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 %>

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

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の中身を変えるだけで使いまわせる。

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

【勉強用】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

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

refileのattachment_image_tagで画像がうまく表示されない場合に

この記事について

画像を表示させるためにrefileのattachment_image_tagで画像が表示されない時があって、いろいろ調べて試行錯誤した結果安定して?表示されるようになったので投稿

問題のエラー

スクリーンショット 2020-08-05 18.35.30.png

白い雲と青い空、そして可愛らしい山を描いた画像で癒されそうだが、こいつは精神を破壊させてくる悪魔の画像。
この悪魔が表示されていた時のコードは以下の通り

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縦幅数値"で書いてる様子はなく、これでなぜ上手くいってるのかが良く分かっていない。
多分根本的な解決にはなっていないから、判明次第編集しまっす。

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

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.rb
  Rails.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#index

collectionルーティングとは

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_reviewsnew_book_reviewなどの親要素(book)が入ったPrefixになります。

URI Pattern への効果

子要素の前に親要素と親要素のidが入ります。
/books/:book_id/reviewsという親要素(book)が入ったURI Patternになります。
/books/:book_idの部分が特定の親要素を表すパスとなり
『子要素がどの親要素とつながりがあるか』が明示的に示されるようになります。

以上になります。

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

【知識用】Railsのルーティングを極める【基本と応用】

基本編

7つのアクションはresourcesで

routes.rb
Rails.application.routes.draw do
  resources :notes
end

限定したいときはonlyとexceptを使う

routes.rb
Rails.application.routes.draw do
  resources :notes, only: [:index, :show]
end
routes.rb
Rails.application.routes.draw do
  resources :tweets, except: [:new, :create, :edit, :update, :destroy]
end

onlyはホワイトリスト系
exceptはブラックリスト系

users/1/notesとしたいときはネスト

routes.rb
Rails.application.routes.draw do
  resources :users do
    resources :notes
  end
end

7つのアクション以外は次の2通り

routes.rb
Rails.application.routes.draw do
  resources :notes do
    member do
      get 'review'
    end
  end
end
routes.rb
Rails.application.routes.draw do
  resources :notes do
    collection do
      get 'search'
    end
  end
end

memberはidで指定した特定のリソースに対するアクション
collectionは全体のリソースに対するアクション
をそれぞれ定義する。

応用編

単純なページならresourceで

routes.rb
Rails.application.routes.draw do
  resource :notes
end

これはindexアクションとidが必要ないときに有効。

パスをグループ化したいときはnamespaceを使う

routes.rb
Rails.application.routes.draw do
  namespace :admin do
    resources :users
  end
end

ルートパスの指定方法はrootで

routes.rb
Rails.application.routes.draw do
  root 'notes#index'
end

まとめ

以上Railsのルーティングのまとめでした。
たったこれだけなんですね!

もう少し単純にまとめられそうに思いました。

あとは機能別にまとめていくのもいいかもしれないと思いました。
例えば商品出品機能とか。
基本の型を作る感じ。

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

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
end

rails db:migrateをすれば追加される。

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

EC2にデプロイしたアプリケーションからシークレットキーを生成できない

エラー

EC2にgithubからアプリをデプロイ完了した状態で

rake secret

を実行したところ下記のようなエラーが

You must use Bundler 2 or greater with this lockfile.

Bundlerのバージョンがおかしいのか??

解決

EC2のでデプロイしたアプリのディレクトリで下記の3つを実行すると
無事シークレットキーを生成できた

rm Gemfile.lock
gem install bundler
bundle
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

sorceryを使用して、ユーザー機能を作成する

自分用です!!

sorceryを使ってログイン機能を作成していきます。

sorceryをインストール

Gemfile
gem sorcery

bundele 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.rb
resources :users, only: %i[new create]

user_sessions controllerでは、newアクションと、createアクションを作成
ここでは、loginというsorceryで使えるメソッドを使いログインします。

user_sessions_controller.rb
 def create 

     @user = login(params[:email], params[:password]) 
     if @user 
       redirect_back_or_to root_path 
     else 
       render :new 
     end 
   end 
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【コピペ用】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.rb
class 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



##まとめ
あまりまとめる必要はないかなと思いましたが
迷ったときに見直したいと思います!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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学習 頑張りましょう!:raised_hand_tone1:

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

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]}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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時間ほど時間を食ってしまった。中級チュートリアルの記事をよく見返すと今回の原因が書いてあったので、以後チュートリアルを進める際は、細部まで目を通すことを心がける。

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