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

キリンめも

記事を書いています #rails #swift #JS #UE4

dump.sql を再読み込みにエラーが出た時の対処法

sql文はあっているはずなのにdumpしたらerrorが表示されるってことありますよね!

こんな感じで

ERROR:  column "id" of relation "column_id" does not exist

そんな時のコードはこちら

drop schema public cascade;
create schema public;

posticoで実証済みです。
手順
1 前のデータを消去
2 再度読み込み
の順番で 作るとうまくできます。

var について啓発する

var について使い方を間違えるとまずいことを学んだのでメモ。

<script>
  var hako = function(){
         for (f=1; f< 5; f+=1){ ... };
  hako();
  }
</script>

上記でもコードは動きますが、一つ注意するべき部分があります。
fにvar を指定せず変数を宣言しています。
では一つの区切りを終わらし、新しく下記に記述します。

<script>
    alert(f);
</script>

結果 5

普通はエラーが起きるのですが、varをつけないことにより
意図しない「グローバル変数」になってしまいます。
なので必ず変数を宣言するときは常にvarをつけて書きましょう。

var hoge = 1;

//または

for(f =1; f< 5; f +=1){
console.log(f);
};

おわり。

Railsの会 17日目「ユーザクラス/4章まとめ」

今回の範囲です。
今回はなんとなく理解している部分だったので詳しく書いています。

f:id:geta206:20170331101007p:plain

ユーザクラス

まずはコードを見てみましょう (example_user.rb)

class User
attr_accessor :name, :email

def initialize(attributes = {})
@name = attributes[:name]
@email = attributes[:email]
end

def formatted_email
"#{@name} <#{@email}>"
end
end


説明していきます。

attr_accessor :name, :email

attr _accessor 外部で email と nameを接続できるようにしています。
(Objectから値が取得できる)

def initialize (attributes = {})

メソッド(initialize)を作り、引数に初期値({}ハッシュ)を入れてます。

どうして初期値を指定しないといけないの??

結論から言うとエラーがでる可能性が出てくるからです。

A def initialize (attributes = {})
B def initialize (attributes )

AとB で意味が違うことに気がつきますか?
Aは 「引数がない時attributesをハッシュとして定義します」
Bは  「initializeの引数は必ず必要です」

つまり Bは値が必ず必要なのに値が入っていない場合エラーが起こるということになります。
なので Aのように記述してエラーを事前に防いでいます。

initialize (初期化)

初期化すると
Objectを生成すると自動でインスタンスがつくられる便利なメソッド。 (private)
hoge.new をすると呼び出されるということになります。


Bでもエラーが出ない方法があります。

 User.new(name: "hoge", email: "hoge.com")

値が指定されているのでエラーを防ぐことができます。

エラーがでる書き方とは?

User.new

Bのコードの意味は 「initializeの引数は必ず必要です」と書いているのにないとおこられます。

次の行に進みます。

 def formatted_email
    "#{@name} <#{@email}>"
  end

メソッドを定義してインスタンス変数(@name @email)を呼び出しています。
何も定義されていない場合はnilになります。

実践

1 > require './example_user' # example_userのコードを読み込む方法
=> true
2 >> example = User.new
=> #
>> example.name # attributes[:name]は存在しないのでnil
=> nil
>> example.name = "Example User" # 名前を代入する
=> "Example User"
>> example.email = "user@example.com" # メールアドレスを代入する
=> "user@example.com"
>> example.formatted_email
=> "Example User "


1  カレントディレクトリからexample_userファイルを探す。
2  @name変数に "Example User"という値を設定。

initializeメソッド - クラスの概念 - Ruby入門

おまけ メソッドについておさらい
def の後に記載しているものは関数。緑色で書かれています(^ω^)

4章まとめ

Rubyは文字列を扱うためのメソッドを多数持っている

Rubyは全てObjectでできている

・def でメソッドを定義

・class でクラスを定義

Railsのview はerbでも使用出来る

Rubyの組み込みクラス(配列  範囲 ハッシュなど)がある

Rubyのブロックは添え字を使うデータ構造より自然にイテレーション出来る

・シンボルとはラベルの事。(代入できない文字列)

Rubyはクラスを継承できる

Rubyの組み込みクラスは内部を見たり修正できる

・deified は回文

Ruby on Rails チュートリアル:実例を使って Rails を学ぼう


次回は5章になります!

Railsの会 16日目「CSS指定 /クラス/initialize」

今回の範囲

f:id:geta206:20170329161843p:plain

ハッシュとシンボル

書き方
その1

 {"hoge" => "hogehoge"}

その2

 {huga: "fugafuga"}  #1.9以降使える
=> と :の違いは?

文字列とシンボルの違い

具体的な話

文字列だと宣言などを繰り返し行った時数値の割り当てが変わる。
1回目 1111111111
2回目 1111111122
シンボルの場合 宣言したとき同じ数値が割り当てられる。
1回目 12345
2回目 12345

ハッシュとは =>

キーを使って、複数のオブジェクトへの参照を
まとめて管理することができるオブジェクト。
ハッシュロケット(=>)の書き方は古いらしい。
それでも=>の書き方を使う理由は、教科書などがハッシュロケットで書くのは=>が全てのversionに対応しているから記述しているらしい。

シンボルとは :

: hoge の書き方をしているものをシンボルという。
文字列以外は基本シンボルを使います。

シンボルのメリット

メモリの利用料が文字列に比べ少なくなる。
Ruby on Rails 入門のための知識 1(シンボルとハッシュ) - OnsenとRuby

CSSの指定方法

指定場所: app/assets/stylesheets
コード

<%= stylesheet_link_tag "custom", :media => "all" %>

コンストラクタ (initializeメソッド)

特殊なメソッド。
クラス内に記述するとオブジェクトを作成した時、
自動で呼び出される。
自動でprivateに設定されます。
戻り値は使われません。
クラスにinitializeメソッドがない時は親クラスから呼び出されます。

呼び方

クラス名.new(引数)


使用例

class Cat
  def initialize(name, color)
    puts "initialize called!"
    @name = name; @color = color
  end
end
 
cat = Cat.new("Tama", "white")

initialize - Rubyリファレンス
Rubyのクラスについてまとめてみた | JavaからのRuby on Rails入門

クラスの継承

class クラス名 < 継承するクラス と指定する

>> class Word < String    # WordクラスはStringクラスを継承する
                                          # 文字列が回文であればtrueを返す
>>   def palindrome?
>>     self == self.reverse    # selfは文字列自身を表します
>>   end
>> end
=> nil

組み込みクラスの変更

組み込みクラスを使用する時は、変数が絶対に空白にならないようにしたいときです。(ユーザー名など)
rubyでは組み込みクラスの拡張ができる。


組込みクラスの変更 - Qiita
【26日目】【1日20分のRailsチュートリアル】基本クラスの拡張とコントローラクラスの学習&Userクラスの作成 - ぞえの技術めも

super classとは

今使用しているクラスはどれを継承しているのかを調べる(クラスの階層を調べる)
stringクラスの継承階層(イメージ図)↓

f:id:geta206:20170329170740p:plain

調べ方(コマンド) 例

>> controller = StaticPagesController.new
=> #
>> controller.class
=> StaticPagesController
>> controller.class.superclass
=> ApplicationController
>> controller.class.superclass.superclass
=> ActionController::Base
>> controller.class.superclass.superclass.superclass
=> ActionController::Metal
>> controller.class.superclass.superclass.superclass.superclass
=> AbstractController::Base
>> controller.class.superclass.superclass.superclass.superclass.superclass
=> Object

Railsの会 15日目「メソッド・データ構造」

今回の範囲

f:id:geta206:20170321111825p:plain

 

agenda

  1. オブジェクトの種類
  2. メソッドの定義
  3. ブロック

 

1. オブジェクトの種類

length   文字の長さを調べる

>> "foobar".length        # 文字列に "length" というメッセージを送る
=> 6

 

?  論理値で返す

例   

>> "foobar".empty?
=> false
>> "".empty?
=> true

 

メソッドチェーン メソッド連続的に呼び出すこと

 例 

>> a << "foo" << "bar"        # 配列に連続して追加する
=> [42, 8, 17, 6, 7, "foo", "bar"]

 

配列の種類

1 to_a メソッドを使う

>> (0..9).to_a            # 丸かっこを使い、範囲オブジェクトに対してto_aを呼びましょう
=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

2     %w (配列)

>> a = %w[foo bar baz quux]         # %wを使って文字列の配列に変換
=> ["foo", "bar", "baz", "quux"]

3    [ ]  を使った書き方

>> a[0..2]
=> ["foo", "bar", "baz"]

数字を使った配列の指定方法

>> a = [42, 8, 17]
=> [42, 8, 17]
>> a[0]               Rubyでは角かっこで配列にアクセスする
=> 42
>> a[1]
=> 8
>> a[2]
=> 17
>> a[-1]              # 配列の添字はマイナスにもなれる! == last
=> 17

その他の指定方法
>> a                  # 配列「a」の内容を確認する
=> [42, 8, 17]
>> a.first
=> 42
>> a.second  #基本使わない
=> 8
>> a.last
=> 17
>> a.last == a[-1]    # == を使って比較する
=> true

 

 

2.メソッドの定義

デフォルトの値を返さなくていい時

def string_message(str = '')   

    strに値が絶対入る場合は省略してもよい。

 nulが入る時は、初期値を上記のようにblankに指定しないといけない。

 

値の追加方法(配列)

>> a.push(6)                  # 6を配列に追加する
=> [42, 8, 17, 6]
>> a << 7                     # 7を配列に追加する
=> [42, 8, 17, 6, 7]
>> a << "foo" << "bar"        # 配列に連続して追加する
=> [42, 8, 17, 6, 7, "foo", "bar"]

   

3.ブロック

処理が一つの時の書き方

>> (1..5).each { |i| puts 2 * i }
2
4
6
8
10
=> 1..5

処理が2つ以上の時の書き方

>> (1..5).each do |
?>   puts 2 * i
>> end
2
4
6
8
10
=> 1..5

mapとeachの違い

map 変更したものを返す  ( 配列 (中身を変更したい時)

each 実行結果を返す        ( 中身の処理を変えたい時)

基本mapで書くとどの処理でも通る。

 

>> %w[A B C].map { |char| char.downcase }
=> ["a", "b", "c"]
>> %w[A B C].map(&:downcase) #省略した書き方( char
=> ["a", "b", "c"]

test ブロック

 test "should get home" do
  get static_pages_home_url
  assert_response :success
  assert_select "title", "Ruby on Rails Tutorial Sample App"
end

今までのおさらい
a-zまで配列にしてshuffleして0から7番目を文字列で表示
('a'..'z').to_a.shuffle[0..7].join