読者です 読者をやめる 読者になる 読者になる

Javaエンジニア、Ruby on Railsでアプリを作る

整理券アプリを作成中です

RubyでArrayをHashに変換する

前回の記事で、ArrayをHashに変換するのにArray#mapとArray#to_hを使用して、ArrayをHashに変換しました。

yucatio.hatenablog.com

オブジェクトの配列を、オブジェクトのIDをハッシュのキー、オブジェクト自身をハッシュのバリューとして登録したい場合があります。

例として、配列のデータをハッシュに変換します。idをキーとして、データ自体を値としたHashを作成するには下記で実現できます。

arr = [
  {id: 1, name: "Alice", age: 20}, 
  {id: 2, name: "Bob", age: 30}
]

arr.map {|data| [data[:id], data]}.to_h
# => 
# {
#   1=>{:id=>1, :name=>"Alice", :age=>20}, 
#   2=>{:id=>2, :name=>"Bob", :age=>30}
# }

順を追って見ていきます。まずmapオブジェクトで、配列の各要素を、[data[id], data]に変換します。

arr.map {|data| [data[:id], data]}
# => 
# [
#   [1, {:id=>1, :name=>"Alice", :age=>20}], 
#   [2, {:id=>2, :name=>"Bob", :age=>30}]
# ]

これを、to_hを使用してハッシュに変換します。

[[1, {:id=>1, :name=>"Alice", :age=>20}], [2, {:id=>2, :name=>"Bob", :age=>30}]].to_h
# => 
# {
#   1=>{:id=>1, :name=>"Alice", :age=>20}, 
#   2=>{:id=>2, :name=>"Bob", :age=>30}
# }

to_hの方法を知る前は以下のように書いていましたが、to_hの方がすっきり書けるように思います。

obj_hash = {}
arr.each { |data|
  obj_hash[data[:id]] = data
}
環境
初めてのRuby

初めてのRuby
著者:Yugui
価格:2,376円(税込、送料込)
楽天ブックスで詳細を見る

Railsでajax通信時にattribute名とfull_messageの組み合わせでレスポンスを返す

ajaxでの非同期通信時に、attributeごとのメッセージを表示するのに手間取ったので記録しておきます。

ajax通信でない時は、errors.full_messages_for(:attribute_name)で各attributeのエラーメッセージは取得できます。

やりたいこと

ajax通信時に、入力エラーがある場合に、入力項目ごとに表示したい。

こうなればよい。

f:id:yucatio:20170414023228p:plain:w400

errorsを使用する場合(うまくいかなかった例)

コード

class TicketsController < ApplicationController
  def create
    ticket = Ticket.create(ticket_params)

    if ticket.save
      render json: {message: 'success'}, status: :created
    else
      error_messages = ticket.errors
      render json: {message: error_messages}, status: :unprocessable_entity
    end
  end
end

レスポンス

{"message":
  {"password":["を入力してください"],
    "email":["を入力してください","は有効でない形式です"]}
}

画面表示

f:id:yucatio:20170414023247p:plain:w400

メッセージボディしか表示されません。これじゃない。

errors.full_messages を使用する場合(うまくいかなかった例)

コード

class TicketsController < ApplicationController
  def create
    ticket = Ticket.create(ticket_params)

    if ticket.save
      render json: {message: 'success'}, status: :created
    else
      error_messages = ticket.errors.full_messages
      render json: {message: error_messages}, status: :unprocessable_entity
    end
  end
end

レスポンスはこのようになります。

{"message":["パスワードを入力してください","メールアドレスを入力してください","メールアドレスは有効でない形式です"]}

画面に表示するとしたらこうなります。

f:id:yucatio:20170414023306p:plain:w400

1ヶ所に全てのエラーを表示する場合はこれでもよいですが、項目ごとに表示するといった目的は達成できません。

ticket.errors.keys と errors.full_messages_for 組み合わせる(うまくいった例)

コード

class TicketsController < ApplicationController
  def create
    ticket = Ticket.create(ticket_params)

    if ticket.save
      render json: {message: 'success'}, status: :created
    else
      error_messages = ticket.errors.keys.map { |key| [key, ticket.errors.full_messages_for(key)]}.to_h
      render json: {message: error_messages}, status: :unprocessable_entity
    end
  end
end

レスポンス

{"message":
  {"password":["パスワードを入力してください"],
   "email":["メールアドレスを入力してください","メールアドレスは有効でない形式です"]}
}

画面表示

f:id:yucatio:20170414023228p:plain:w400

できました!

環境
パーフェクトRuby on Rails

パーフェクトRuby on Rails
著者:すがわらまさのり
価格:3,110円(税込、送料込)
楽天ブックスで詳細を見る

RubyMineでRuby on railsの開発をする その8: おすすめ設定3つ

ナビゲーションバーの表示

現在開いているファイルの階層をウィンドウ上部に表示させます。

View > Nabigation Bar を選択

f:id:yucatio:20170207185038p:plain:w200

画面上部に awesome_events > app >views > events > new.html.slim と、現在開いているファイルの階層が表示されるようになりました。

f:id:yucatio:20170204195918p:plain

階層をクリックすると、同階層の他のファイルが表示され、ここからファイルを開くことができます。同一コントローラの他のファイルを参考のため開くときに便利です。

f:id:yucatio:20170204195931p:plain

空白文字の表示

半角空白や全角空白はデフォルトでは単なる空白ですが、空白文字の表示を設定すると、それぞれ別の記号で表示してくれるようになります。

RubyMine メニュー > Preferences.. を選択

f:id:yucatio:20170204195806p:plain:w200

Editor > General > Appearence をい開いて、Show whitespaces のチェックを入れます。

f:id:yucatio:20170204195823p:plain

半角スペースは.(ドット)、全角スペースは□(四角)、タブは→|で表示されるようになりました。

f:id:yucatio:20170204195735p:plain

チームで開発している場合は、チームメンバーにもこの設定を入れてもらいましょう。 新人が全角空白や、タブを仕込んでくるのをちょっとは防げるはず。

ツールバーの表示

各種操作を行うためのツールバーを表示します。

View > Toolbar を選択します。

f:id:yucatio:20170204195840p:plain:w200

ツールバーが表示されました。各種タスクを実行するのに便利です。

f:id:yucatio:20170204195853p:plain

環境
  • Mac : Sierra 10.12.2
  • Ruby : 2.3.3
  • Rails : 4.2.6
  • RubyMine : 2016.3.1
パーフェクトRuby on Rails

パーフェクトRuby on Rails
著者:すがわらまさのり
価格:3,110円(税込、送料込)
楽天ブックスで詳細を見る

RubyMineでRuby on railsの開発をする その7: ER図の出力

RubyMineでのERDの出力方法です。引き続き、"パーフェクト Ruby on Rails" に掲載されているサンプルアプリ (awesome_events)を使用していきます。 DBの設定が事前に必要です。

yucatio.hatenablog.com

DBを右クック > Diagrams > Show Visualization… を選択します。

f:id:yucatio:20170204155020p:plain

Rails Model Dependency Diagram を選択します。

f:id:yucatio:20170204155204p:plain

ER図が出力されました。

f:id:yucatio:20170204155443p:plain

環境
  • Mac : Sierra 10.12.2
  • Ruby : 2.3.3
  • Rails : 4.2.6
  • RubyMine : 2016.3.1
パーフェクトRuby on Rails

パーフェクトRuby on Rails
著者:すがわらまさのり
価格:3,110円(税込、送料込)
楽天ブックスで詳細を見る

RubyMineでRuby on railsの開発をする その6: DB (Sqlite) の設定

RubyMineでのSqliteの設定方法です。引き続き、"パーフェクト Ruby on Rails" に掲載されているサンプルアプリ (awesome_events)を使用していきます。

yucatio.hatenablog.com

Sqliteの設定

View > Tool Windows > Database を開く。

f:id:yucatio:20170204151513p:plain

Databaseウィンドウが開きます。

f:id:yucatio:20170204151645p:plain

プラス記号 > Import from sources を選択します。

f:id:yucatio:20170204151742p:plain

developmentを選択します。

f:id:yucatio:20170204151923p:plain

初回はJDBCドライバのエラーが出るので、'Download missing driver files' をクリックして、ドライバファイルをダウンロードします。

f:id:yucatio:20170204152046p:plain

Error: Driver class ‘org.sqlite.JDBC’ not found の対処をします。

f:id:yucatio:20170204152148p:plain

リンク先に飛ぶと、Sqliteの設定タブに飛ぶので、ここでApplyを押します。

f:id:yucatio:20170204152436p:plain

元の、コネクション作成の画面に戻ります。

f:id:yucatio:20170204151923p:plain

Test Connection でコネクションのテストをします。

成功しました。OKを押して、DBの設定を完了します。

f:id:yucatio:20170204153313p:plain

DBに接続され、テーブル一覧、カラム一覧が表示されました。 これで開発効率が上がりそうです。

f:id:yucatio:20170204153446p:plain

SQLの実行

SQLを実行します。テーブル名やカラム名SQLキーワードは補完してくれます。便利。

f:id:yucatio:20170204153734p:plain

緑の三角矢印を押して、実行します。 表形式で見れます。見やすい。

f:id:yucatio:20170204153926p:plain

ちなみに、SQLを入力するウィンドウは、データベースパネル > プラス記号 > Console File で追加することができます。

f:id:yucatio:20170204154056p:plain

環境
  • Mac : Sierra 10.12.2
  • Ruby : 2.3.3
  • Rails : 4.2.6
  • RubyMine : 2016.3.1
パーフェクトRuby on Rails

パーフェクトRuby on Rails
著者:すがわらまさのり
価格:3,110円(税込、送料込)
楽天ブックスで詳細を見る

RubyMineでRuby on railsの開発をする その5: rspecの実行

引き続き、"パーフェクト Ruby on Rails" に掲載されているサンプルアプリ (awesome_events)のテストをRubyMineで行なっていきます。

yucatio.hatenablog.com

rspec-railsがインストールされていることが前提となります。

rspec install の実行

f:id:yucatio:20170129233135p:plain

rspecをinstallします。

f:id:yucatio:20170130084359p:plain

環境は development のままOKボタンを押します。

f:id:yucatio:20170130085058p:plain

ファイルごとのテスト

ファイルごとのテストは、ファイルを開いて、右クリック > Run ‘Run spec …’ を選択します。

f:id:yucatio:20170202000625p:plain

実行結果が表示されました。

f:id:yucatio:20170202000803p:plain

全テストケースの実行

全テストケースの実行は、Run > Run… を選択して、

f:id:yucatio:20170116001612p:plain

spec: プロジェクト名 を選択します。

f:id:yucatio:20170202001225p:plain

実行されました。テストが失敗していることがわかります。

f:id:yucatio:20170202001449p:plain

次回はDBの設定です。

yucatio.hatenablog.com

環境
  • Mac : Sierra 10.12.2
  • Ruby : 2.3.3
  • Rails : 4.2.6
  • RubyMine : 2016.3.1
パーフェクトRuby on Rails

パーフェクトRuby on Rails
著者:すがわらまさのり
価格:3,110円(税込、送料込)
楽天ブックスで詳細を見る

RubyMineでRuby on railsの開発をする その3: rails generate controller

前回に引き続き、"パーフェクトRuby on Rails" に掲載されているサンプルアプリ (awesome_events)の開発をRubyMineで行なっていきます。

yucatio.hatenablog.com

rails generate controller

controllerを作成します。 プロジェクト名を右クリック > New > Run Rails Generator… f:id:yucatio:20170129233135p:plain

Generator名に'con'と入れれば、'controller' が候補に出てくるので、選択します。 f:id:yucatio:20170129230339p:plain

コントローラ名とアクションを入力して、OKを押します。 f:id:yucatio:20170129230156p:plain

rails generate controller が実行されました。 f:id:yucatio:20170129230524p:plain

次回はモデルを作成します。

yucatio.hatenablog.com

環境
  • Mac : Sierra 10.12.2
  • Ruby : 2.3.3
  • Rails : 4.2.6
  • RubyMine : 2016.3.1
パーフェクトRuby on Rails

パーフェクトRuby on Rails
著者:すがわらまさのり
価格:3,110円(税込、送料込)
楽天ブックスで詳細を見る