edy hub

プログラミングやライフスタイルについて書き綴っています

Rubymineの「typo」警告を特定のワードの場合に無くしたい

どんなケース?

これはtypoに見せかけて、プロジェクト内では列記とした単語なんじゃ!という場合。 毎回警告が出るとうざいですよね。 f:id:yuki-eda0629:20190323150041p:plain

解決方法

該当ワードで右クリック すると、Spellingという項目が出てきます(自分の場合は、トップに出てきました) f:id:yuki-eda0629:20190323150309p:plain

さらに「Spelling」> 「Save '該当ワード' to project-level directory」を選択 f:id:yuki-eda0629:20190323150406p:plain

さいごに

波線と警告がなくなりました!!めでたし! f:id:yuki-eda0629:20190323150603p:plain

Goのセットアップを行う

はじめに

普段は業務でRubyを使っているが、多言語に対応して一丁前のエンジニアになるべく、Goの学習をしてみる(週末限定)

リファレンス

このサイトが非常に役に立った。

cuto.unirita.co.jp

Goのインストール

自分はMacを使用しているため、homebrewでGoをインストールする。

$ brew install go

これで完了!

GOPATHの設定

bash_profile(又は、bashrc)に環境変数を記述する。

export GOROOT=$HOME/go

GOPATHの指定としては、選択肢として、①ルートディレクトリ配下②home以下にgoディレクトリを作成 の2パターンがありそうです。

参考

Go言語の開発環境セットアップ - Qiita

インストールの確認

適当なファイルを生成し、下記の内容を記述する。

今回はhello.goというファイルを作成。

package main
import "fmt"

func main(){
    fmt.Printf("Hello, World!\n")
}

続いて、チェックを行う。 下記コマンドと期待する出力が得られれば完了!

$ go version
go version go1.12 darwin/amd64

$ go run hello.go
Hello, World!

これ以降は...

Goの学習用にA Tour of Goというサイトが設けられています。

インタラクティブに学習を進められるので、環境構築前に触りたい人にオススメです。

go-tour-jp.appspot.com

Railsのテーブル定義書を吐き出したい

はじめに

プロジェクトメンバーにエンジニア以外の関係者がいるときに、テーブル定義書を用意することになった。

テーブル定義書とは?

方法

下記を参考にrakeタスクを作成する。

gist.github.com

とりあえず動かしてみる

lib/tasks内にrakeタスクを作成する。

lib/tasks/dbdoc.rake




エラーが発生!

def get_schema_info(klass)
    table = Table.new
    table.name = klass.table_name
    table.columns = []
    table.indexes = []
    table.comment = klass.connection.retrieve_table_comment(klass.table_name) if defined? MigrationComments

    # 省略
end

ここで、klass(つまりmodels配下の*.rbファイル)とデータベースの整合性が合わない場合に、table_nameでNo Method Errorが発生した。

確認してみると、google_place.rbというGoogleMap用に設けていたモデルファイルが存在していた。

また、appliaction_record.rbというファイルについては、klassがnilで返ってきた。

そのため、もともとの配列から削除してあげることにした。

task dbdoc: :environment do
    klasses = Dir["app/models/**/*.rb"].
      reject{|f| f["concerns/"] }.
      reject{|f| f["app/models/google_place.rb"]}. # 追加
      reject{|f| f["app/models/application_record.rb"]}. # 追加
      map{|f| f.gsub(/^app\/models\/(.+?)\.rb$/, '\1') }.
      map{|m| ActiveSupport::Inflector.camelize(m) }.
      map{|k| ActiveSupport::Inflector.constantize(k) }
    datum = klasses.map{|k| get_schema_info(k) }
    # 省略
end

これで綺麗なklassesの配列が出来上がった。

datum内を覗いてみると、

=> [#<struct Table
  name="hoge_table_names",
  comment=nil,
  columns=
      [#<struct Column name="id", type="bigint(20)", not_null=false, default=nil, primary_key=true, comment=nil>,
    #<struct Column name="hoge_id", type="int(11)", not_null=true, default=nil, primary_key=false, comment=nil>,
    #<struct Column name="huga_id", type="int(11)", not_null=true, default=nil, primary_key=false, comment=nil>,
    #<struct Column name="created_at", type="datetime", not_null=false, default=nil, primary_key=false, comment=nil>,
    #<struct Column name="updated_at", type="datetime", not_null=false, default=nil, primary_key=false, comment=nil>],
  indexes=[]>,
  #<struct Table
    name="contract_plans",
    comment=nil,
    columns=....

というような配列が返ってきた(良い感じ)

しかし、またもやエラーが発生

安堵していたのも束の間、別のエラーが発生した。

rake aborted!
NameError: uninitialized constant Axlsx

何やら不明なAxlsxがあるらしい。

Axlsxとは?

AxlsxはExcelファイルの出力用に用いるらしい。

qiita.com

これを参考にした。

対策

GemfileにExcelファイルを扱うためのGemを導入した。

gem 'axlsx'
gem 'zip-zip'

gem 'zip-zip'を含めないと、axlsxとの依存関係によりエラーが発生します。

これで動くだろう

rakeタスクを実行してみます。

$ bundle exec rake dbdoc:dbdoc

これで、xslxの拡張子付きのテーブル定義書が発行されました〜

Railsのベストプラクティスを教えてくれ

はじめに

こちらの記事は現場でRuby on Railsを用いている筆者が、独断と偏見でRailsのTipsをまとめたサイトを収集する記事です。

基本的に「まとめのまとめ」のスタンスを取ります。

つまり、私の備忘録です。

1. Rails Best Practices

一発目から海外の英語記事ですが()

rails-bestpractices.com

Rubyの基礎を改めて学習し直してみた(インスタンス)

これは何か?

  • Rubyの文法を復習し直す場
  • RubyRailsを学習する方に向けた記事

インスタンス変数

インスタンス変数とは、オブジェクトが抱えている変数のこと。

例えば下記のようなrubyファイルにUserクラスがあったとする。

class User
end

ここで、rubyのセッターとゲッターという概念が登場する。

class User
  def name=(name)
    @name = name
  end
  
  def name
    @name
  end
end

irbを起動して動作を確認してみる

$ irb
irb(main):001:0> require './user.rb'
=> true
irb(main):002:0> user = User.new
=> #<User:0x00007fc32d1cf3e8>
irb(main):003:0> user.name = 'hoge'
=> "hoge"
irb(main):004:0> user.name
=> "hoge"

hogeという値をuserオブジェクトのnameに代入しました。 ここで、userオブジェクトの中身を確認してみます。

irb(main):005:0> user
=> #<User:0x00007ffd56056d50 @name="hoge">

userオブジェクトが「hoge」を抱えている様子がわかりますね。 このuserオブジェクトが抱えているnameを 属性(Attribute) と呼ぶことがあります。

attr_accesorを使う

実は、このゲッターやセッターはもっと簡略化して記述することが可能です。 それは、attr_accessorというメソッドによって実現されます。

先程のコードを例に出すと、下記のように記述可能です。

class User
  attr_accessor :name
end

とても簡単ですね!!👏

サービスに当てはめると?

Webサービスに当てはめると、Userが持つ情報は、name以外にあるはずです。 例えば、メールアドレスや性別などがあります。

このときに、先程のattr_accessorで複数個の属性を定義することができます。

class User
  attr_accessor :name, :email, :sex
end
$ irb
/ 省略
irb(main):002:0> user = User.new
=> #<User:0x00007f9936342cc8>
irb(main):003:0> user.name = "Mario"
=> "Mario"
irb(main):004:0> user.email = "test@sample.com"
=> "test@sample.com"
irb(main):005:0> user.sex = "male"
=> "male"
irb(main):006:0> user
=> #<User:0x00007f9936342cc8 @name="Mario", @email="test@sample.com", @sex="male">

こうして、userオブジェクトに複数個の属性を定義することができました。