メモ(11月) 編集途中

11月12日

<%= form_for(@user, url: signup_path) do |f| %>

form_forの理解をしていない。

*コラム**8.1.**「*||=*」とは何か?**←**これ分からなかった*>> @foo
=> nil
>> @foo = @foo || “bar”
=> “bar”
>> @foo = @foo || “baz”
=> “bar”
@fooが元々値があって使いたい時、値がなくnilだったときに他の値を入れるたいときにする。
`@current_user ||= User.find_by(id: session[:user_id])`

`current_user ||= 'ゲストさん'`
[Nilガード]とも言う

[8.2.4 レイアウトの変更をテストする]
```
def logged_in?
!current_user.nil?
end
```
上記の`!`の意味が分からない。`!`を外したらエラーがでた。


[8.2.5 ユーザー登録時にログイン]
ログインしたときには、ログインの中はnil出ないと言うことを確認するテストを書く。のはわかった。

[8.3 ログアウト]
`test/integration/users_login_test.rb`のファイルにはコードを貼り付けていて理解していない。
```
test "login with invalid information" do
get login_path
assert_template 'sessions/new'
post login_path, params: { session: { email: "", password: "" } }
assert_template 'sessions/new'
assert_not flash.empty?
get root_path
assert flash.empty?
end
```
assert_not flash.empty?を光らせる?
assert_not flash.empty?が光るかどうか。確かめる
Testというのは上記の二つの表現だとどちらがイメージにちかいのか。

ブラウザのcookieを調べ
`option`+`command`+`I`でApplicationでcookieを見ることができる。

```
メソッドを呼び出したときの引数が少ないですよ。というエラー。
(wrong number of arguments (given 0, expected 1))
>> user.authenticated?('1EJsFNkX262jZDYGitEEqQ')
=> true
```

```
確かめる方法
BCrypt::Password.new(remember_digest).is_password?(remember_token)

コンソール画面で
>> BCrypt::Password.create('aaa')
=> "$2a$10$cwPGIcpE136fHHzsqaHAX.BusV76fgcpZubeKDVctvFfFSpM/fOQC"
>> BCrypt::Password.create('aaa') == BCrypt::Password.create('aaa')
=> false
>> BCrypt::Password.create('aaa').is_password?('aaa')
=> true
```

```
if boolean?
var = foo
else
var = bar
end
三項演算子を使うと、上のコードはこのようになります。

var(←与えたい変数) = boolean? ? foo : bar
boolean? ? "bar" : "baz"

>> if a == 1
>> puts "1"
>> else
>> puts "x"
>> end
三項演算子で表示
>> puts a == 1 ? "1":"x"
x
=> nil
```

演習9311
分からない

 

# 11月14日  
### テストが理解できていない

```
fixture
test/fixtures/users.yml

```
10.2.3 フレンドリーフォワーディング  分からなかった→理解できた(下記参照)
```
<テストが実際に行なっていること>
⓵.../users/1/editにアクセスする
⓶session[:forwarding_url] <= [.../users/1/edit] が代入される
⓷ログインする。
⓸下記のメソッドのように
session.deleteされるので、中身がnilかどうか確認する。
<file> :app/helpers/sessions_helper.rb
def redirect_back_or(default)
redirect_to(session[:forwarding_url] || default)
session.delete(:forwarding_url)
end

<テスト内コードと意味>
⓵get edit_user_path(@user)
→editへアクセスさせる。
⓶assert_equal session[:forwarding_url], edit_user_url(@user)
→イコールですか? 「session[:forwarding_url]」と「edit_user_url(@user)」は?
⓷log_in_as(@user)
⓸assert_nil session[:forwarding_url]
→中身はnilになってますか?
```

また、分かったこと。
・Testでのタイトルが一緒だとtestエラーがでる。(クラス内とかだと思うけど、クラス外でもダメかどうかは確かめる必要がある。)
・`ymlファイル`はtestやdbに入れたりするデータとして保存をしたりするもの。

 

# 11月15日
```
10.4.2.演習のエラーが解決できない

Endの数が多くて、定義したメソッドが一つのロジックのなかのものとしてあったので、メソッド定義がされていないというエラーメッセージが出てきていた。
結果、`unless`が二つ書かれていたので、endが余分に必要になっていた。
```

`RESTのルール`

`PATCHリクエスト`

```
routes.rbの
resources :account_activations, only: [:edit]
の意味。
```

```
○○○
Testファイルのコードを見て、どこのコードのtestをしているか。理解していないので、
——error文——————————————————————————————————————
ERROR["test_index_as_admin_including_pagination_and_delete_links", UsersIndexTest, 1.1211480000056326]
test_index_as_admin_including_pagination_and_delete_links#UsersIndexTest (1.12s)
NoMethodError: NoMethodError: undefined method `email' for nil:NilClass
test/test_helper.rb:26:in `log_in_as'
test/integration/users_index_test.rb:11:in `block in <class:UsersIndexTest>'
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
が出ても、どこのコード(viewなのか、controllerか。とか)を確認していいのか分からない。

○○○testファイル内のsetupメソッドで、@adminを与えていない
```


```
>db/seeds.rbの「有効にする」について、ファイル内の[true]などの変更次第で毎度調整するものなのか?

ーーファイル内コードーーーーーーーーーーーーーーーーーーーーーーー

User.create!(name: "Example User",
email: "example@railstutorial.org",
password: "foobar",
password_confirmation: "foobar",
admin: true,
activated: true,
activated_at: Time.zone.now)

99.times do |n|
name = Faker::Name.name
email = "example-#{n+1}@railstutorial.org"
password = "password"
User.create!(name: name,
email: email,
password: password,
password_confirmation: password,
activated: true,
activated_at: Time.zone.now)
end

——————————————————————————————————————————————————
```

```
○○○このエラーがわからない

—————エラーコード———————————————————————————————————
FAIL["test_invalid_signup_information", UsersSignupTest, 0.9305580001091585]
test_invalid_signup_information#UsersSignupTest (0.93s)
Expected at least 1 element matching "form[action="_signup"]", found 0..
Expected 0 to be >= 1.
test/integration/users_signup_test.rb:16:in `block in <class:UsersSignupTest>'
———————————————————————————————————————————————

_signupというアクションが存在していなかった。
```

```
○○○
test "login without remembering" do
# クッキーを保存してログイン
log_in_as(@user, remember_me: '1')
delete logout_path
# クッキーを削除してログイン
log_in_as(@user, remember_me: '0')
puts cookies['remember_token'] ←←※※※※
assert_nil cookies['remember_token']
end

test "login with remembering" do
log_in_as(@user,remember_me:'1')
puts @user.email
puts @user.remember_token
puts cookies['remember_token']
assert_not_empty cookies['remember_token']
assert_equal cookies['remember_token'], assigns(:user).remember_token
end

※※※※ nilになっているとエラーメッセージが出てきていたので、本当にnilなのか?putsで出力してみ他ところ
```

```
○○○test/system/test_helper.rb

テストユーザーとしてログインする
def log_in_as(user, password: 'password', remember_me: '1')
post login_path,params:{session:{email: user.email,
password: 'password',←←
remember_me: 'remember_me'}}←←
end

=> 最初の log_in_as で password と remember_me の値を入れても、そのあとのpassword と remember_meで値を ''で囲んで文字列として与えているので、テストするときに全てが同じ'文字列'のpassword と remember_meになってしまう。(下記の様に書く。)


def log_in_as(user, password: 'password', remember_me: '1')
post login_path,params:{session:{email: user.email,
password: password,
remember_me: remember_me}}
end

```

```
edit_user_url(user)
上のメソッドは、次の形式のURLを生成します。

http://www.example.com/users/1/edit
これに対応するアカウント有効化リンクのベースURLは次のようになります。

http://www.example.com/account_activations/q5lt38hQDc_959PVoo6b7A/edit

このurlにログインしてください。で登録完了です。
のやつ。(+で、30分以内にとか)
```

 

# 11月16日

```
$ rails test:mailers (11.2.4の前)
エラーが解けない。演習1のところでストップ

ERROR["test_account_activation", UserMailerTest, 0.3459359999978915]
test_account_activation#UserMailerTest (0.35s)
ActionView::MissingTemplate: ActionView::MissingTemplate: Missing template user_mailer/account_activation with "mailer". Searched in:
* "user_mailer"

app/mailers/user_mailer.rb:10:in `account_activation'
test/mailers/user_mailer_test.rb:8:in `block in <class:UserMailerTest>'

1/1: [===============================================================================================================================================================] 100% Time: 00:00:00, Time: 00:00:00

Finished in 0.34698s
1 tests, 0 assertions, 0 failures, 1 errors, 0 skips
```

```
○○○
<エラー文>
Missing template user_mailer/account_activation with "mailer". Searched in: * "user_mailer"

=>
[user_mailer/accout_activation]に該当するviewを[user_mailer]から探したけれど何もみつからなかった。  という意味で。

[accout_activation]が[account_activation]していなくて[n]が抜けていた。ファイルの名前を変更して、エラー無くした。
```

11章
```
1.3.演習

ここまでの演習課題で変更したコードをテストするために、/users と /users/:id の両方に対する統合テストを作成してみましょここまでの演習課題で変更したコードをテストするために、/users と /users/:id の両方に対する統合テストを作成してみましょ
```

```
クラスメソッドかインスタンスメソッドか理解しながら、やる!
なぜクラスインスタンスなのか。考えながらやるべき。

classを調べながらやるべき。

```


```
def activate
update_columns(activated: true, activated_at: Time.zone.now)
end

update_columnsの引数は2つではなく、1つ。
{activated: true, activated_at: Time.zone.now}という一つのハッシュを入れてる。{}を省略している。
```


```
def create
puts '---------------'
puts params
puts '---------------'
puts params[:session]
puts '---------------'
…….
end

=>rails server内
---------------
{"utf8"=>"✓", "authenticity_token"=>"Vq7ZziyPK5Yv1LwBTDY/Wrn9XEOserL2hUsHSbvJ+RaifiUv8U6HhhkhnWSVQ8wcNnGt73PMzgmnxhKKmbxP6w==", "session"=>{"email"=>"test2@example.com", "password"=>"password", "remember_me"=>"0"}, "commit"=>"Log in", "controller"=>"sessions", "action"=>"create"}
---------------
{"email"=>"test2@example.com", "password"=>"password", "remember_me"=>"0"}
---------------

[HTMLソース]
name="session[email]"

このようにsessionみたいにまとめることで、
"session"=>{"email"=>"test2@example.com", "password"=>"password", "remember_me"=>"0"}
params内でまとめ登録フォームなどで

user = User.new(params[:session])
user.save
でまとめて一括で保存することができる。

通常だと、、
user = User.new(email: params[:email], password: params[:password], params[:remember])
user.save
とかで、カラムが増えると一括で保存することがとても便利になってくる。


```

 

# 11月17日

`encodeメソッドとencode!メソッドは、文字列の文字コードを変換します。`

```
[user_params]について

user_params という private メソッドの中に注目してください。

「params.require(:user).permit(:name, :email)」となっています。

このコードは「params が :user というキーを持ち、params[:user] は :name 及び :email というキーを持つハッシュであること」を検証します。

例えば、params[:user] が {:name => 'taro', :email => 'taro@example.com'} のようなハッシュである場合に検証 OK となります。

```

 

# 11月19日
```
seed.rbファイルで

「,」を忘れていて、期待した画面にならなかった。
seedファイルのコードエラーによって、上手く作動していなかった。

ちなみに家で出ていたエラーは「id = 」が見つかりませんよー。というエラが出ていた。

そこで、seedファイルをいじって出たので、seedファイルの構文は間違っていないかな??
migrate:resetでどこまで削除されるんだろうと考えておくべきであった。

```

```
<エラー文>
FAIL["test_should_not_allow_the_not_activated_attribute", UsersControllerTest, 1.5523180000018328]
test_should_not_allow_the_not_activated_attribute#UsersControllerTest (1.55s)
Expected response to be a <3XX: redirect>, but was a <200: OK>
test/controllers/users_controller_test.rb:65:in `block in <class:UsersControllerTest>'

リダイレクトしないといけないところを、OKでそのままサイトに入ることを許している。

<test文>
test "should not allow the not activated attribute" do
log_in_as(@non_activated_user)
→ログインを試みる
assert_not @non_activated_user.activated?

get users_path
assert_select "a[href=?]", user_path(@non_activated_user), count: 0
→users(index)で「loocalhost.../users/1」みたいなものが見つからないこと。
get user_path(@non_activated_user)
→[user]のshowページにいく。
assert_redirected_to root_url
→ルートページにしっかり写っているか?
end

結局ログインしていないのに、showにいけた。before_actionでshowを加えていなかったので追加した。

◆原因
・自分で仕様を理解していなかった。
・(ログインしていないユーザが)users全体は見れないのに、showが見れる。という点におかしいなときづけなかった。

 

```

### サイトの仕様を理解する!
```
サイトの仕様を理解していないので、エラーが出ても解決できない。
testも理解できていない。

エラーが出た時は
「○○を期待しているけども、××が出るからなんでだろう?」と考えないといけない。

```

```
testで失敗したら、まずtestの手順でdevelopmentで動作確認してみる。

```

 

``````ブロック変数
array = [1, 2, 3, 4] array.each do |num|  p numend```
```処理をした前と後で結果が変わらないことを確かめたいテスト。assert_no_difference 'Micropost.count' do      post microposts_path, params: { micropost: { content: "Lorem ipsum" } }    end
上記の中身はブロックで構成されており、
def assert_no_difference before = yieldand after = yieldand before == afterend
assert_no_difference(expressions, message = nil, &block)
```
```link_to(文字列, パス [, オプション, HTMLオプション])```
```pluralizeの最初の引数に整数が与えられると、それに基づいて2番目の引数の英単語を複数形に変更したものを返します。
>> helper.pluralize(1, "error")=> "1 error">> helper.pluralize(5, "error")=> "5 errors"
```
```Micropost.where("user_id = ?", id)上の疑問符があることで、SQLクエリに代入する前にidがエスケープされるため、SQLインジェクション (SQL Injection) と呼ばれる深刻なセキュリティホールを避けることができます。
例えば$ SELECT * FROM users WHERE name = '(入力値)';
ここで入力値に "t' OR 't' = 't" という文字列を与えた場合を考えると、SQL文は次のように展開される。
$ SELECT * FROM users WHERE name = 't' OR 't' = 't';
「't' = 't'」が入ってきたら、「それ以外全て(誰が何を入力してもイコールで同じになるから)」ということになってしまう。全てのデータが取得できてしまう。そのような攻撃を悪意でやってくる悪い奴らがいる。
だからこのような攻撃を避けるために「?」を使ってエスケープ(入力値を?で置換する)するといい。「?」があれば、「't' OR 't' = 't';」と入力されても、エラーを返してくれる。
```
```any? メソッド
all?メソッドは、ブロック引数itemに要素を入れながらブロックを繰り返し実行し、ブロックが真が返したときは繰り返しを中断してtrueを返します。ブロックの戻り値がすべて偽であるとき、あるいはレシーバが空であるときにはfalseを返します。
```

```@micropost = Micropost.new(content: "Lorem ipsum", user_id: @user.id)
という書き方が、以下のように書き換えられます。
@micropost = @user.microposts.build(content: "Lorem ipsum")
(newメソッドと同様に、buildメソッドはオブジェクトを返しますがデータベースには反映されません。) 一度正しい関連付けを定義してしまえば、@micropost変数のuser_idには、関連するユーザーのidが自動的に設定されます。

```

# 11月20日# 11月20日
[assert_selectの使い方 - ザリガニが見ていた…。](http://d.hatena.ne.jp/zariganitosh/20080405/1207455670)```assert_selecteを利用すると、CSSセレクタで指定する要領でHTMLの構造が適切かどうか、効率よく調べることができる。```
```
assert_redirected_to
assert_redirected_to(options = {}, message=nil) =>  渡されたリダイレクトオプションが、最後に実行されたアクションで呼び出されたリダイレクトのオプションと一致することを主張する。このアサーションは部分マッチ可能。たとえばassert_redirected_to(controller: "weblog")はredirect_to(controller: "weblog", action: "show")というリダイレクトなどにもマッチする。assert_redirected_to root_pathなどの名前付きルートを渡したり、assert_redirected_to @articleなどのActive Recordオブジェクトを渡すこともできる。
```

```
<%= f.file_field :picture, accept: 'image/jpeg,image/gif,image/png' %>
このときacceptパラメータでは、ファイル形式を、MIMEタイプで指定するようにします。```

```
<a href=“/signup” >signup </a>```

```$ redirect_to(リダイレクト先のURL [, :status => ステイタスコード, オプション])
「redirect_to @user」はどこに飛んでるのか分かってない。

$ render オプション

```

HTMLでGETとPOSTのデータの送受信をするためのコード種類[入力フォーム編(GETとPOSTデータを受け取るには) - futomi’s CGI Cafe](https://www.futomi.com/lecture/form/index.html)

[ render ]と[ redirect_to ]  の違い[railsのrenderとredirect_toの違い - Qiita](https://qiita.com/1ulce/items/282cccba1e44158489c8)図でわかる[render と redirect の違い - Qiita](https://qiita.com/january108/items/54143581ab1f03deefa1)

```
◆クラスメソッドを定義する時の意味として、インスタンスに関わらず、全体として使うメソッドをクラスメソッドで定義した方が良い。————————————————————————————————————def User.digest(string)      cost = ActiveModel::SecurePassword.min_cost ?               BCrypt::Engine::MIN_COST :                                  BCrypt::Engine.cost                                  BCrypt::Password.create(string, cost: cost)end
==> 「ハッシュとして出力する」————————————————————————————————————def User.new_token      SecureRandom.urlsafe_base64 end
==>「暗号化して出力する」—————————————————————————————————————
インスタンスメソッドはインスタンスに何かの動作を与えるメソッド。
```
```テストエラーについては、他の似ているテストと比較してみる。とエラーを解決できる場合がある。
—————————————————————————————————————  assert_no_difference 'Micropost.count' do      post microposts_path, params: { micropost: { content: "" } }    end———————————————————————————————————
———————————————————————————————————assert_difference 'Micropost.count', 1 do    post microposts_path,  micropost: { content: content, picture: picture } ←paramsが無かった    end——————————————————————————————————

```

# 11月21日

```
演習
1, 図 14.7のid=1のユーザーに対してuser.following.map(&:id)を実行すると、結果はどのようになるでしょうか? 想像してみてください。ヒント: 4.3.2で紹介したmap(&:method_name)のパターンを思い出してください。例えばuser.following.map(&:id)の場合、idの配列を返します。

2, 図 14.7を参考にして、id=2のユーザーに対してuser.followingを実行すると、結果はどのようになるでしょうか? また、同じユーザーに対してuser.following.map(&:id)を実行すると、結果はどのようになるでしょうか? 想像してみてください。
```

```
Relationshipモデルなのに、テーブル名が「active_relationships」にして書かないといけないのか?

has_many :「active_relationships」, class_name: "Relationship",
foreign_key: "follower_id",
dependent: :destroy

```

14.2の演習もしないといけない

 

```
差分を見て、間違い箇所を探す。

$ diff sample.rb db/migrate/20181120144005_create_relationships.rb
1c1
< class CreateRelationships < ActiveRecord::Migration[5.0]
---
class CreateRelationships < ActiveRecord::Migration[5.1]
9,11c9,11
< add_index :relationships, :follower_id
< add_index :relationships, :followed_id
< add_index :relationships, [:follower_id, :followed_id], unique: true
---
add_index relationships, :follower_id
add_index relationships, :followed_id
add_index relationships, [:follower_id, :followed_id], unique:true
>
```

```
メソッドが使えない時。(undefined method エラーが出るときは)
クラスメソッドかインスタンスメソッドか考えるだけ。
——————————————エラーが出たコマンド—————————————————
>> user.active_relationship.follower
>> active_relationship.follower
>> active_relationship
>> active_relationships.follower
>> active_relationship
>> User.active_relationships
—————————————————————————————————————————————
ここで、「active_relationship」メソッドが何をするメソッドかよく考える。

```

```
<models/user.rb>——————————————————————————————

class User < ApplicationRecord

has_many :microposts, dependent: :destroy
has_many :active_relationships, class_name: "Relationship",
foreign_key: "follower_id",
dependent: :destroy
,,,
end
————————————————————————————————————————————

ここで、モデルに定義されているデータベースから情報を取得する観点から「クラスメソッド」ということが分かり、
「その中で[ "follower_id" ]が一致するものを全て取り出す。」というメソッドである。
下記のコマンドで、
[ relationships テーブル] の中の [follower_id : 1]のものを全て出力するということ。

>> User.first.active_relationships (User.firstは “id = 1”のもの)
User Load (0.2ms) SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ? "LIMIT", 1
Relationship Load (0.1ms) SELECT "relationships".* FROM "relationships" WHERE "relationships"."follower_id" = ? LIMIT ? [["follower_id", 1], ["LIMIT", 11]]
=> #<ActiveRecord::Associations::CollectionProxy [#<Relationship id: 1, follower_id: 1, followed_id: 2, created_at: "2018-11-21 04:14:31", updated_at: "2018-11-21 04:14:31">]>

```

[image:F74F866D-9E0D-4F03-9197-81D50B32CFDD-63530-0002053CE023AE69/スクリーンショット 2018-11-21 14.27.19.png]


```
---------------SQL文のチェック-----------------------------


>> user.unfollow(other_user)
Relationship Load (0.3ms) SELECT "relationships".* FROM "relationships" WHERE "relationships"."follower_id" = ? AND "relationships"."followed_id" = ? LIMIT ? [["follower_id", 1], ["followed_id", 2], ["LIMIT", 1]]
(0.1ms) begin transaction
SQL (0.7ms) DELETE FROM "relationships" WHERE "relationships"."id" = ? "id", 1
(2.3ms) commit transaction
=> #<Relationship id: 1, follower_id: 1, followed_id: 2, created_at: "2018-11-21 04:14:31", updated_at: "2018-11-21 04:14:31">
>> user.following?(other_user)
User Exists (0.2ms) SELECT 1 AS one FROM "users" INNER JOIN "relationships" ON "users"."id" = "relationships"."followed_id" WHERE "relationships"."follower_id" = ? AND "users"."id" = ? LIMIT ? [["follower_id", 1], ["id", 2], ["LIMIT", 1]]
=> false
>> user.follow(other_user)
(0.1ms) begin transaction
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]]
SQL (1.1ms) INSERT INTO "relationships" ("follower_id", "followed_id", "created_at", "updated_at") VALUES (?, ?, ?, ?) [["follower_id", 1], ["followed_id", 2], ["created_at", "2018-11-21 06:40:05.767336"], ["updated_at", "2018-11-21 06:40:05.767336"]]
(1.0ms) commit transaction
User Load (0.2ms) SELECT "users".* FROM "users" INNER JOIN "relationships" ON "users"."id" = "relationships"."followed_id" WHERE "relationships"."follower_id" = ? LIMIT ? [["follower_id", 1], ["LIMIT", 11]]

```
[image:51A88ECD-CE57-48D6-8F38-DF6A794C4EB9-63530-0002092A2DDB2F06/スクリーンショット 2018-11-21 15.43.26.png]


```
リダイレクトされる理由

・before_action とかで制限がかけられている!


```

 

# 11月22日 rails ガイドを読んで

`オブジェクトリレーションマッピング`とは、
アプリケーションが持つオブジェクトをRDBにテーブル接続すること。

`コンフィギュレーション`とは、設定のこと。

`fixture(フィクスチャ)`とは、
テストを実行、成功させるために必要な状態や前提条件の集合のこと。

### 1 マイグレーションの概要
`トランザクション`
ワンセットの処理のまとまりのこと。複数処理の中で一つでも成功しなかったら全てをなかったことにする。このような処理に一貫性を持たせるような処理を`トランザクション処理`という。

`ステートメント`
プログラムでの命令、宣言などを行う文などのこと。また、複数のステートメントを一つの文として扱えるようにまとめたもののことを`ブロック`という。

`クエリ`
DBにする命令のこと。

`アダプタ`
何かと何かの仲介役をしてくれるもの。
### 2 マイグレーションを作成する
Railsではマイグレーションの実行順序をファイル名のタイムスタンプで決定します。従って、マイグレーションを他のアプリケーションからコピーしたり、自分でマイグレーションを生成する場合は、実行順に注意する必要があります。

[image:3A33D5B0-2577-48CA-9946-D85B4F4DE15A-63530-0002328FA9C14708/スクリーンショット 2018-11-22 15.10.17.png]

`フラグメント`
http://e-words.jp/w/%E3%83%95%E3%83%A9%E3%82%B0%E3%83%A1%E3%83%B3%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3.html

### 3.9 reversibleを使用する ←理解できなかった。
・逆転?execute <<-SQL

### 4.6 マイグレーション実行結果の出力を変更する
`boolean(ブーリアン)`
プログラムのデータ型の一つで、「true , false」、「on , off」、「yes , no」などの二者択一条件のデータを格納するデータ型のこと。

### 5 既存のマイグレーションを変更する
マイグレーションをいったんロールバック (bin/rails db:rollbackなど) してからマイグレーションを修正し、それから修正の完了したバージョンのマイグレーションを実行するためにbin/rails db:migrateを実行する必要があります。
=>マイグレーションを直接修正するのではなく、そのためのマイグレーションを新たに作成してそれを実行するのが正しい方法です。

### 6.2 スキーマダンプの種類
`ダンプ`
見たい内容をファイルに出力すること。
DBからダンプする→「DBの内容をファイルに出力すること」
出力との違いは、「手も加えず、そのまま」というニュアンスで`ダンプ`が使われる。

`トリガー`
何かのきっかけとなるもの。何かのきっかけで動き出すプログラムも`トリガー`と呼ぶ。

`シーケンス`
一つ続きで連なったもの。配列など。

`ストアドプロシージャー`
DBに対する、命令をまとめたもの、戻り値もない関数のこと。

`チェック制約`
一つ以上の値を格納できる値を制限すること。($100~$15000 みたいな)

### 8 マイグレーションとシードデータ

`seed機能`
開発段階で初期データを読み込むためのもの。[$ rails db:seeds ]
development環境やtest環境で頻繁にデータを再読込する場合に特に便利です。

### 1 バリデーションの概要
### 1.5 errors[]
`any?メソッド`
ブロック引数で列挙したものを繰り返し処理実行して行く。途中で真になったら[ true ]を返して中断する。ブロックの戻り値が全て偽だった場合は[ false ]を返す。

### 2.12 validates_with
`リスト`
ソースコードのこと。

`属性`
オブジェクトの付加情報のこと。
オブジェクト(自分:人)だったら。
属性→男、20代、o型  みたいなもの。 

`バリデーションヘルパー`
presence, lengthなどのこと。

 

# 11月25日

`トリガー`
何かの動作を開始するきっかけとなる命令や信号のこと。
`Proc(プロック)`
Procedure(プロシージャ) … ひとまとまりの処理(返り値の無い関数)

`ワンライナー`
たった一行のプログラムのこと。

`CSVファイル`
文字列とカンマ区切りで構成されたファイルのこと。エクセルとかにインポートすることができる。

`マクロ`
事前に操作手順などを記録しておいて、その記録した内容をまとめて実行できるようにする機能のこと。

`キュー`
FIFO(先入先出)の何か。

`スタック`
LIFO(後入先出)の何か。

`パラメータ`
外から入ってくる値。

`belongs_to`
従属する側のモデルに belongs_to を記述する。また、belongs_toで関連付けされたクラスに外部キーがある。
`has_one`
従属させる側のモデルに has_one を記述する。

`エンティティ`
実体のこと。

[MySQL初級者を脱するために勉強してること -INDEX編- - Qiita](https://qiita.com/kkyouhei/items/e3502ef632c48d94541d)

`アサイン`
仕事、命令のなどの割り振りのこと。

`プレースホルダ`
正式な値が入るまで一時的に場所を確保しておくこと。

 

# 11月27日

```
<< migrationファイル の作成コマンドを間違えた >>
<< (timestamps)_add_user_ref_to_tweets.rb >>

class AddUserRefToBooks < ActiveRecord::Migration[5.1]
(↑↑自分自身でコマンドなどでクラス名を設定するので、migrateにはこのクラス名は特段関係ない。)

(↓↓関係あるのは下記のメソッド内)
def change
add_reference :books, :user, foreign_key: true
end
end

=>statusを見て、downしているときに、ファイル名とクラス名を変更したい名前に変えてから、migrateする。

```

```
わからないときに、検索するのは公式のガイドやドキュメント
難しく書いてあったときは、わかりやすい記事を見つけてそれを読んでみる。

railsには規約があるので、それに沿ってやらないとエラーになる。エラーの解決策を調べるよりも規約を確認する。
```

```
マイグレーション (change/up/down)
```

[migrationファイルの記法メモ | DoRuby](https://doruby.jp/users/katamemo/entries/migration_)
```
removeのmigrationの時はup/downを使うようにする。
changeメソッドだとロールバックできない
```

2.12 validates_with([Active Record バリデーション | Rails ガイド](https://railsguides.jp/active_record_validations.html#validates-with))
[RubyRails Rails で DB と連携しない model を作る: 遠回りするかな](http://suke.cocolog-nifty.com/blog/2015/08/rails-rails-db-.html)
DBと連携しないmodelが必要となり、DB連携しないmodel作成には
$ rails new が必要でよくわからなくなり、飛ばした。
`アクティブモデル::バリデータ を継承するモデルの作成の仕方がわからない`

2.13 validates_each([Active Record バリデーション | Rails ガイド](https://railsguides.jp/active_record_validations.html#validates-each))
ブロックコードが読めない。

5.1 :ifや:unlessでシンボルを使用する([Active Record バリデーション | Rails ガイド](https://railsguides.jp/active_record_validations.html#if%E3%82%84-unless%E3%81%A7%E3%82%B7%E3%83%B3%E3%83%9C%E3%83%AB%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B))

6 カスタムバリデーションを実行する([Active Record バリデーション | Rails ガイド](https://railsguides.jp/active_record_validations.html#%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%90%E3%83%AA%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B))

 

# 11月28日

```
・これはインスタンスなのか?クラスなのか?
・メソッドなのか?
ruby , rails なのか?
ruby のライブラリーか?
・raisl のライブラリーか?
```


コールバッククラス([Active Record コールバック | Rails ガイド](https://railsguides.jp/active_record_callbacks.html#%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E3%82%AF%E3%83%A9%E3%82%B9))

2.6 has_and_belongs_to_many関連付け([Active Record の関連付け (アソシエーション) | Rails ガイド](https://railsguides.jp/association_basics.html#has-and-belongs-to-many%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91))

HABTMの結合モデルを持たないテーブルの情報の更新・追加をコンソール画面でしたかったが、モデルが存在しないので、できなかった。更新・追加のをどのようにするのか知りたい。

 

# 11月29日

2.9 ポリモーフィック関連付け([Active Record の関連付け (アソシエーション) | Rails ガイド](https://railsguides.jp/association_basics.html#%E3%83%9D%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91))

中間テーブルにデータを反映させることができない。なので、動作確認ができず。
参考:[Railsポリモーフィック関連とはなんなのか - Qiita](https://qiita.com/itkrt2y/items/32ad1512fce1bf90c20b)
= >「[【Railsポリモーフィック関連の作り方と使い方 - Qiita](https://qiita.com/geshi/items/9e76f8d407dfd3e5211b)」これを見たらできた!!!!!!!!!
```
>> employee = Employee.first
=> #<Employee id: 1, name: "tako", created_at: "2018-11-29 01:54:29", updated_at: "2018-11-29 01:54:29">

>> employee.pictures.create(name: "tako従業員")
=> #<Picture id: 1, name: "tako従業員", imageable_id: 1, imageable_type: "Employee", created_at: "2018-11-29 06:20:18", updated_at: "2018-11-29 06:20:18">


また、今回は「ポリモーフィック関連付け」という形で
幅広く検索をしていたので、該当記事が出てこなかった。

「has_many ポリモーフィック」のように少し絞り込んで検索しなければならない。
```


```
分からないのが悪いのではない。分からなければ調べればいい。

<< cnfig/database.yml ファイル>>

default: &default <<< デフォルト
adapter: sqlite3
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
timeout: 5000

development: <<< ローカルでの開発環境
<<: *default
database: db/development.sqlite3

test: <<< ローカルでのテスト環境
<<: *default
database: db/test.sqlite3

production: <<< 本番環境
<<: *default
database: db/production.sqlite3


```


2.10 自己結合([Active Record の関連付け (アソシエーション) | Rails ガイド](https://railsguides.jp/association_basics.html#%E8%87%AA%E5%B7%B1%E7%B5%90%E5%90%88))


`プロキシ`
Webブラウザとクライアントの中間役をする。サーバー代理のようなもの。
`プロキシ`を使用することによって、①サーバーが早くなる。②身元を隠せる。というメリットがある。

`バッチ`
一括でやること。

`バッチ処理`
定量のデータを集め、一括処理をするための処理方法。

`SQLインジェクション`
DBを不正に操作する攻撃方法のこと。また、その攻撃を可能とするDBの脆弱性のこと。


`Client.where(locked: true)`
これの`locked`ってメソッド?どういう意味?