12月メモ、編集中

# 12月3日

```
<< schema.rb >> が反映されない。

$ rails db:schema:dump
をしてschemaの更新を図る。。。。できない。

>> Status Migration ID Migration Name
--------------------------------------------------
up 20181130073118 Create job offers
up 20181130102909 Create wages
up 20181130111343 Add wage ref to job offer
up 20181130120802 Create employment statuses
up 20181130124831 Add employment status ref to jobs
up 20181203013059 Create working hours
up 20181203013420 ********** NO FILE **********
up 20181203020211 Create features
up 20181203020429 Add feature ref to job offer
up 20181203022529 Create job categories
up 20181203022919 Add job category ref to job offer
up 20181203024420 Create prefectures
up 20181203024619 Create municipalities
up 20181203024934 Add prefecture ref to municipality
up 20181203040020 Create railway lines
up 20181203040510 Create stations

「20181203013420」のファイルを消したようなので、このファイルをDBから削除する。

[Execute SQL]で削除文を書いて削除した。
DELETE FROM schema_migrations WHERE version= 20181203013420;
この後、 commit のコマンドを入力して、削除を反映した。

commitをしないとDB側からだけの削除にしかならないので、しっかりとアプリケーション側でも反映させるようにした。

それでも[ schema.rb ]が反映されていなかったので、一度削除してから、
$ rails db:migrate
したらすべてのテーブル情報が反映されていた。


```

# 12月6日


[SQL 16. データベースの設計 1 | TECHSCORE(テックスコア)](http://www.techscore.com/tech/sql/SQL16/16_01.html/)
```

<< ユニーク制約が上手くできない >>
エンティティの意味を英単語の意味しか調べていなかった。。
DBの用語として「エンティティ」があり、その意味を理解していなかった。

また、下記の2つがあることを知っておくべき、

アプリケーションサーバー(railsフレームワーク)の中の一意制約
・DBサーバー(mysql)の中の一意制約

MySQLの一意制約
=>構文エラーが出てきてわからなくなった。

Railsで設定する一意制約

・中間テーブルでモデルを作る場合と、作らない場合の使い分け
(上記はAcrtive Recordの関連ずけなどもイメージして)


・エンティティ(データベースなどの用語)

```

[データベースのトランザクション処理とは:不可分なひとつながりの処理|データ分析用語を解説 - データビジュアライズで経営を視える化する/graffe グラーフ](https://www.graffe.jp/blog/488/)


```
データベースの種類
mysql
・posgreSQL
SQlite
SQLserver
Oracle

いくつか種類があって、自分の使っているDBの種類によってコードが違ってくる。

<今回のミス>
SQliteを使っているのに、SQLserverの構文で調べて見ていた。だから構文エラーが出た。
```

# 12月4日

```
<< index: true オプション >>
Rename column wage idto salary

JobOffer.second.features << Feature.find(2)

```

```
検索方法はこのようにやりたい!

$ select distinct job_offer_id from features_job_offers where feature_id in ('1','2');
一つにして出力する方法

```

 

<<Rails>>
```

>> municiplities = Municiplity.find_by( prefecture_id: 1)
>> JobOffer.find(id: municiplities.id)

 

```

 

# 12月5日

masterテーブルへ情報入れる
=> Seedファイルなどを使って情報を入れることができない
```
 <エラー分>
ActiveRecord::StatementInvalid: SQLite3::BusyException: database is locked: commit transaction

db側で操作をしていてcommitしていなかったので、コンソール画面でエラーが出ていた。
PCには「アプリケーションサーバー」と「DBサーバー」があることを思い出して、
2つが連携をしてテーブルに反映するということを思い出す。

db側でcommitをしたら、コンソール画面でもできるようになった。

```

```
seedファイルにcreateを記述しているため
seedするたびに増えてしまう。。

```

job_offerテーブルに仮値を入れる

masterとjob_offerの関連付けを一つずつやっていく。

 

# 12月7日

has_and_belongs_to_many (HABTM) の中間テーブルにデータを入力したかった。

配列(複数持つもの)を引数に渡す << メソッド
```
>> job.employment_statuses.create << EmploymentStatus.find(3)
NoMethodError
(undefined method `<<' for #<EmploymentStatus:・・・>)

[ << ]は
ActiveRecord::Associations::CollectionProxyクラス」のインスタンスメソッド

```

Createメソッドの引数としては
ハッシュなどを入れないといけない。インスタンス変数を引数として渡したらエラーとしてそうでた。

```
>> job = JobOffer.first
>>job.employment_statuses_job_offers.create(employment_status_id: '1')
NoMethodError (undefined method 'employment_statuses_job_offers' )

=>「こんなメソッド定義されてない。」とエラー。
そのとおりだ!ここの中間テーブルはモデルを持たない中間テーブルだ!
また、ここに来るメソッドは[EmploymentStatusモデル]のメソッドが来る。

方法①
>> em = EmploymentStatus.second
>> job.employment_statuses << em
これで中間テーブルに
["job_offer_id", 14], ["employment_status_id", 2]
と入力ができた。

方法②:creteメソッドを用いてデータを入れる。
>> job.employment_statuses.create(id: 3)
(0.1ms) begin transaction
(0.1ms) commit transaction
=> #<EmploymentStatus id: 3, name: nil, created_at: nil, updated_at: nil>
上記のままでは、nameカラムにバリデーションをかけているので、保存ができない。
>> job.employment_statuses.create(id: 100, name: '一日働く')
employment_statusテーブルに(id: 100, name: '一日働く')を保存してから
中間t−ブルに[["job_offer_id", 14], ["employment_status_id", 100]]と値を入れる。

クリエイトだと

ここで下記のように入れると<<エラーになる
>> job.employment_statuses.create(employment_status_id: 3)
(エラー)
ActiveModel::UnknownAttributeError (unknown attribute 'employment_status_id' for EmploymentStatus.)
引数としては[EmploymentStatusモデル]のemployment_statusesテーブルにあるカラムをハッシュとして入れないと行けない。

方法③:masterテーブルのDBにないものも作ってから中間テーブルに反映させる
>> em103 = EmploymentStatus.new(id: 103, name: '2日だけ働く')
>> job.employment_statuses << em103
[["job_offer_id", 14], ["employment_status_id", 103]]
```

 

12月10日

`オープンソースソフトウェア(OSS)`
Ruby、Phythonのように無料でソースコードが公開されていて、利用が許されるソフトウェアのこと。

`ブランチ名`, `コミットメッセージ`の命名規則について
[Gitでやらかさないための事前予防策 - Qiita](https://qiita.com/muran001/items/f13742b51da3a22117ee)

```
ブランチ名

[チケット番号]-[動詞]-[名詞]
```
```
コミットメッセージ

#[チケット番号] [動詞] [名詞] [副詞句、その他(オプション)]
```


`コンバート`
何かを何かに置き換えること。

`フォルダへ移動する`
DiagnosticReportsの中を確認したかったときにどのようにフォルダを探せばいいのかわからなかった
`command + shift + g` をすると検索画面が表示される。


```
<< SQLiteからmysqlへ移行する >>
mysqlのバージョンが違っていた。
一般的な5ではなくmysql8をインストールしていた。

$ ps -ef | grep mysql

% brew uninstall mysql
% brew install mysql@5.7


```


```
<< database.yml >>

default: &default
adapter: mysql2
encoding: utf8
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
timeout: 5000
username: root
password: 123456789
host: localhost

development:
<<: *default
database: lacotto_app_development

test:
<<: *default
database: lacotto_app_test

production:
<<: *default
database: lacotto_app_production

-------------------------------------------------------------
development: , test: , production: で共通のものは
「default:」にまとめる。
------------------------------------------------------------
< 命名規則 >
development:
<<: *default
database: lacotto_app_development  ←←ここについて

最初、SQLite3を使っており、「database: db/test.sqlite3」としていた。
SQLite3だとファイル名のように命名することができるが、mysqlだとこのファイル名のようにすると命名規則違反となり、エラーが発生する。
また、development: , test: , production: のそれぞれで命名を変えておかないとデータがゴチャゴチャになる。一緒にするとデータが一つ他のファイルのデータが混ざってデータが増えたりすることがある。

<改善点>
mysql命名規則を調べて対応すればできた。
・gemの対応するmysqlのバージョンがちゃんと対応しているか調べるべきだった。(今回は、mysql5とmysql8の2つをhomebrewにインストールしていて、mysql8を採用して使っていた。その中で、2つのmysqlのバージョンをインストールしたいたこともあり、gem:mysql2が上手く対応できていなかった。)
mysqlのインストールのし直し(mysql側)
$ brew uninstall mysql
$ brew install mysql@5.7
②gemのインストールし直し(rails側)
$ bundle show
$ bundle clean
$ bundle clean --force
ここで、「bundle install先」のように検索をして、しっかりSQLite3が削除されて、重複がしていないか。確認↓↓
$ ls -lrt ~/.rbenv/
$ s -lrt ~/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/

mysqlを反映させるときには、mysql側とrails側で考えてそれぞれの規約に沿って定義しているか確認する。
★★・mysqlにパスワードを設定しているなら、railsのdatabase.ymlの方にも記載しないと行けない。(アクセスができなくなるから) database.ymlの記載の仕方を理解していなかった。

 

 

```

mysqlにデータを移行する際に
<<以前に外部キーとして設定したカラムの削除>>したかった!
```
<<エラー文>>
Mysql2::Error: Cannot drop index 'index_job_offers_on_employment_status_id': needed in a foreign key constraint: ALTER TABLE `job_offers` DROP `employment_status_id`

ActiveRecord::StatementInvalid: Mysql2::Error: Cannot drop index 'index_job_offers_on_employment_status_id': needed in a foreign key constraint: ALTER TABLE `job_offers` DROP `employment_status_id`


①外部キーの削除
mysql> ALTER TABLE job_offers drop foreign key fk_rails_7b83c06002;

「foreign key」の後は「foreign keyの名前」を入れる。
※名前は[sequel Pro]で「関係」の欄から見ると、名前はのっている。


②インデックスの削除
mysql> ALTER TABLE job_offers DROP INDEX index_job_offers_on_feature_id;

INDEX の後は「indexの名前(自分で名前を指定した場合はその名前)」を入れる。

③カラムの削除
mysql> ALTER TABLE job_offers drop column feature_id;


外部キーを設定しているカラムはただ削除するだけでは、[外部キー制約]や[index制約]があってエラーがでる。なので、順番に剥がしていくイメージで、①、②の順に削除していって最後に③カラムを削除する。

```
↓↓ rails 側でも同じ
```
class RemoveFeatureIdFromJobOffers < ActiveRecord::Migration[5.1]
def change
①remove_foreign_key :job_offers, :features
②remove_index :job_offers, :feature_id
③remove_column :job_offers, :feature_id
end
end
```

```
rake db:drop
rake db:create
bundle exec rails db:migrate
bundle exec rails db:drop

```

 

# 12月11日

配列のやり方忘れているので、「たのしいrubyを読み返す」
```
>>municipalities = Municipality.where(prefecture_id: 13)

>>municipalities.each do |municipality|
?> municipality.id.to_a
>> end
(1,2)
>>[job_offersテーブルから東京都に含まれるmuniciplity_id を取り出す処理を書く。]

>> ar = Array.new
=>
>> municipalities.each do |municipality|
?> ar << municipality.id
>> end
>> ar
=> [1, 2]
>> JobOffer.where(municiplity_id: ar)
JobOffer Load (0.5ms) SELECT `job_offers`.* FROM `job_offers` WHERE `job_offers`.`municiplity_id` IN (1, 2) LIMIT 11


自分で更に追加したが、これとかは?試してない。
>> municipalities.each do |municipality|
?> JobOffer.where(municiplity_id: "#{municipality.id}")
>> end


```


配列、文字列、

Rubyの文法を抑える。

 

# 12月12日

[MySQLの文字コード事情 2017版](https://www.slideshare.net/tmtm/mysql-2017)

・あと質問ですが求人を都道府県で絞り込みたいときどうすればいい?
  SQLとRailsのコードそれぞれで回答できるとよいね。
・新規でjob_offersに関して、登録したらエラーになった。

```
(3.0ms) BEGIN
JobOfferProvition Load (1.3ms) SELECT `job_offer_provitions`.* FROM `job_offer_provitions` WHERE `job_offer_provitions`.`id` = 2 LIMIT 1
Municipality Load (1.3ms) SELECT `municipalities`.* FROM `municipalities` WHERE `municipalities`.`id` = 2 LIMIT 1
SQL (2.9ms) INSERT INTO `job_offers` (`name`, `title`, `corporate_message`, `company_overview`, `salary_description`, `working_time_description`, `job_description`, `qualification_requirements`, `welfare`, `created_at`, `updated_at`, `job_offer_provition_id`, `station_id`, `municipality_id`, `address`, `phone_number`, `mail_address`) VALUES ('旨唐揚げと居酒メシ「ミライザカ」目黒東口駅前店', 'キッチンスタッフ (未経験でも問題なし。お仕事しながら料理もマスター)', '料理に興味があれば、未経験でも大丈夫。お客様に喜んでもらえる料理を提供しよう。', '国内外食事業、宅食事業', 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', '▼勤務期間短期(1ヶ月以内)、短期(3ヶ月以内)、長期(3ヶ月以上)※長期でも短期でも 働き方はご相談下さい。※店舗状況により条件異なる。▼シフト週2日以上※1日3時間以上17:00~翌3:00金土及び祝前日は翌5:00※開始・終了時間は曜日により異なります。◆シフトに融通がきくので、ご相談はお気軽に♪▼シフト自己申告制あり▼勤務時間帯夕方、夜、夜勤', 'みんなでお店を盛上げていこう!初めてでも大丈夫!わからない事は店長や先輩スタッフが丁寧に教えるので、働きやすさバツグン
```

==>>[NOT NULLなどの制約の設定 - Ruby on Rails入門](https://www.javadrive.jp/rails/model/index9.html#section2)
```
400文字の「a」ではあるが、mysqlの方のvarchar(バーキャラ)がデフォルトである255文字になっていたので、mysql側からのエラーが出ていた。mysql側でのエラーを考慮してrails 側でのvalidationを設定しないと、不整合が起きる。rails 側のエラーだとエラーメッセージなど残せて、かつ入力した値は残すことができるが、mysql側でのエラーだとそのままドカンとエラー!!になってしまうから。(limit制約)

```

```
Mysql側のエラーだと下記の様な感じ、エラーメッセージなどrailsを通していないので出ない。
>> job.errors.full_messages
=>
```

やること

%= render @users %>

```
<%= f.collection_select(:name, @features, :id, :name, :prompt => "選択してください") %>


==>>
<select name= "feature">
<% @features.each do |feature| %>
<option value=””><%= feature.name %></option>
<% end %>
</select>
```


Method を定義しないと行けない

getとpost で

パスワード 取られたくないデータはpostで

 

# 12月14日

SQL副リ問い合わせ
関連先のテーブルも一緒に情報を取り出す方法

最初は読んでもよくわからなかったけど、声に出して文字をたどって、コードをたどってやればできた。
[Rails コンボボックスの値の保持について(select_tag,c -Rails コンボ- Ruby | 教えて!goo](https://oshiete.goo.ne.jp/qa/5839426.html)

[新人エンジニアの皆さんへ、先輩に相談する前にやるべきことと、上手な相談の方法 - Qiita](https://qiita.com/zakuro9715/items/5bde95f992e7ddf2dc7f)

 

```
job_offersテーブルのカラムを
information_provition_id → job_offer_provition_idに変更する

まず、①〜③方式でchange_columnをやってみる。
できなかったら検索する。 

```

20181209105329 ChangeColumnToJobOffer: migratingで
外部キー制約を削除してから、また追加したいのだが追加できていない。

```
①rename_column :job_offers, :information_provide_id, :job_offer_provition_id
②remove_foreign_key :job_offers, :job_offer_provitions
★change_column :job_offers, :job_offer_provition_id, :bigint, null: false ←←これをしたかった!!
③add_foreign_key :job_offers, :job_offer_provitions

★をやりたかったがために、①でまず

```

 

```
SQLがたくさんでる。
=>このやり方だと、検索画面などで膨大なデータを使うときにDBに負担をかけてしまうので、膨大なデータを扱うときは、SQL文が少ないように[include]をなどを使うようにする。
=>このように書くメリットとしては、コードが読みやすくわかりやすいというメリットがある。なので、[show]などの詳細ページなど一つのデータを取ってくるときなどは①ようにかくとよい。


>> JobOffer.all.each do |j|
?> puts j.job_categories.map(&:id)
>> end
JobOffer Load (0.6ms) SELECT `job_offers`.* FROM `job_offers`
JobCategory Load (0.4ms) SELECT `job_categories`.* FROM `job_categories` INNER JOIN `job_offers_job_categories` ON `job_categories`.`id` = `job_offers_job_categories`.`job_category_id` WHERE `job_offers_job_categories`.`job_offer_id` = 1
1
10
16
JobCategory Load (0.3ms) SELECT `job_categories`.* FROM `job_categories` INNER JOIN `job_offers_job_categories` ON `job_categories`.`id` = `job_offers_job_categories`.`job_category_id` WHERE `job_offers_job_categories`.`job_offer_id` = 2
1
10
16
JobCategory Load (0.3ms) SELECT `job_categories`.* FROM `job_categories` INNER JOIN `job_offers_job_categories` ON `job_categories`.`id` = `job_offers_job_categories`.`job_category_id` WHERE `job_offers_job_categories`.`job_offer_id` = 3
4
5
9
10
14
JobCategory Load (0.3ms) SELECT `job_categories`.* FROM `job_categories` INNER JOIN `job_offers_job_categories` ON `job_categories`.`id` = `job_offers_job_categories`.`job_category_id` WHERE `job_offers_job_categories`.`job_offer_id` = 4
6
11
14
15
16
JobCategory Load (0.3ms) SELECT `job_categories`.* FROM `job_categories` INNER JOIN `job_offers_job_categories` ON `job_categories`.`id` = `job_offers_job_categories`.`job_category_id` WHERE `job_offers_job_categories`.`job_offer_id` = 5
2
7
11
14
16
JobCategory Load (0.3ms) SELECT `job_categories`.* FROM `job_categories` INNER JOIN `job_offers_job_categories` ON `job_categories`.`id` = `job_offers_job_categories`.`job_category_id` WHERE `job_offers_job_categories`.`job_offer_id` = 6
6
10
16
```

```
SQLが3文だけ、膨大なデータから検索を掛けるときは②を使う。

>> JobOffer.includes(:job_categories).each do |j|
?> puts j.job_categories.map(&:id)
>> end
JobOffer Load (0.4ms) SELECT `job_offers`.* FROM `job_offers`
HABTM_JobCategories Load (0.5ms) SELECT `job_offers_job_categories`.* FROM `job_offers_job_categories` WHERE `job_offers_job_categories`.`job_offer_id` IN (1, 2, 3, 4, 5, 6)
JobCategory Load (0.4ms) SELECT `job_categories`.* FROM `job_categories` WHERE `job_categories`.`id` IN (1, 10, 16, 4, 5, 9, 14, 6, 11, 15, 2, 7)
1
10
16
1
10
16
4
5
9
10
14
6
11
14
15
16
2
7
11
14
16
6
10
16
```

 

```
@user = User.find_by(email: params[:password_reset][:email].downcase)

の`params[:password_reset]`が必要な理由がわからない。

中身には、そのパスワード再設定するページのurlなどがparamstとして入っているとは思っていてて、emailというカラムに`params[:email]`以外を持ってくると、探したいuserを見つけられないと思う。
```

 

# 12月17日

### 絶対パスと相対パス
<< view/show.html.erb >>
```
<%= link_to(job_offer.title, “show/#{job_offer.id }”) %>

```
でやっても期待したURLにアクセスされない→「show/show/2」
`絶対パス`と`相対パス`を理解していなかった。
今回は、階層的にshowページにいる状態`http://localhost:3000/show`で相対パスの`show/2`を与えているだけなので、そのまま
`http://localhost:3000/show/show/2`となる。

絶対パスで設定したら上手くアクセスできた。
```
<%= link_to(job_offer.title, “/show/#{job_offer.id }”) %>

→http://localhost:3000/show/2
```

実際には相対パスを設定することは少なく、絶対パスで設定することが多い。


### ルーティングの設定
```
Prefix Verb URI Pattern Controller#Action
index POST /index(.:format) job_offers#index
GET /index(.:format) job_offers#index
job_offers GET /show/:id(.:format) job_offers#show
apply GET /apply(.:format) job_offers#apply
```

Prefix(プレフィックス)の追加は`as`で定義する。<< config/routes.rb >>
```
get 'show/:id' => 'job_offers#show', as: 'job_offers'
```
これを追加することで、上記の
```
<%= link_to(job_offer.title, job_offers_path(job_offer.id)) %>
```
このように定義することができる。

`(Prefix名)(:id)`とすれば`routing`できる。

### resouceを使う。

<<config/routes.rb>>で`resources :users`と設定すると
下記のような、routingを作ってくれる。
```
Prefix Verb URI Pattern Controller#Action
users GET /users(.:format) users#index
POST /users(.:format) users#create
new_user GET /users/new(.:format) users#new
edit_user GET /users/:id/edit(.:format) users#edit
user GET /users/:id(.:format) users#show
PATCH /users/:id(.:format) users#update
PUT /users/:id(.:format) users#update
DELETE /users/:id(.:format) users#destroy
```

`pluck メソッド`
DBからデータを取ってくるメソッド!配列とかにもよしなにやってくれる。

```
@features = Feature.includes(:job_offers).where(job_offers: { id: params[:id] })
feature_id = Array.new
@features.each do | feature |
feature_id << feature.id
end
```
上記を、`pluckメソッド`と`関連`を使うことで
```
@job_offers = @job_offers.includes(:features).where(features: { id: @job_offer.features.pluck(:id) })
```
とコードを短くできる。

### 検索のコツ
```
・railsでしたいことをSQLだと「###」と表すがrailsでは?みたいな幹事で紐づけて検索するとよい。
・検索する前に問題の原因や調べたいことを明確にしたほうがいい。エラーメッセージだけ調べても解決策を得られないことがよくある為。
・rails で算出されたSQL文を実行してみる。どのようなSQL文が出たのか。結果だけ見たら同じでも出してるSQL文が異なる場合があるので。
```

 

# 12月18日

・form_withを使って、フォーム画面を書いていく。
・書き方のテンプレートを理解する
・`params`をどのように送信するか理解する。
・`value`,`id`,`name`

### 分からない
<<entry.html.erb>>
・`都道府県`を入力したら、該当する`市区町村`を選んでセレクトボックスに表示したい。
・`現在の職業`のテーブルだけ必要な感じがする。


[form用正規表現判定/備忘 - Qiita](https://qiita.com/fubarworld2/items/9da655df4d6d69750c06)
↑↑正規表現について調べる。

ラジオボタンとチェックボックスの違い→genderについて

・Rails の言語設定を日本語にする。

 

12月19日
Map調べる
```
>> a =
=>

>> a = [1,2,3,4,5,6]
=> [1, 2, 3, 4, 5, 6]
>> a.map{|f| f*2}}
=> [2, 4, 6, 8, 10, 12]
>> a[1]
=> 2
>> a.map{|f| f*2}[1]
=> 4
```

入力値を保持する。
```

@entryの中に何が入っ

```

エラーメッセージを出す。

 

# 12月20日

問題点


```
・入力値の値が維持できない。
gender radio_button
```


```
応募のメールを送る

rails g mailer => メイラーの生成
↓作成されるファイル↓
app/application.mailer.rb
app/entry.mailer.rb
app/views/entry_mailer/entry_activation.html.erb
app/views/entry_mailer/entry_activation.text.erb

```


```
birthday date_select

=>DATE型にして
'シングルコート',"ダブルコート"の使い分け

●シングルコートは、文字をそのまま返す。
'#{y}-#{m}-#{d}' => "\#{y}-\#{m}-\#{d}"

●ダブルコートは、中の変数、改行などできる。
"#{y}-#{m}-#{d}" => "1994-9-9"

2つで使うときは、下記のような感じで使う。
>>"#{params['birth_date(1i)']}-#{params['birth_date(2i)']}-#{params['birth_date(3i)']}"
```

```
・まとめてインスタンスに代入できない。
@entry = Entry.new(params[:entry])
とコードを書いても、入力値の維持のときに空欄になってしまう。

・saveできない
全部入力フォームを埋めているが、saveできない

```
[【Ruby on Rails】require と permit の使い方がよく分からない - きゃまなかのブログ](http://techblog.kyamanak.com/entry/2017/08/29/012909)
[Formに入力した値を維持したままリロードする方法 - Qiita](https://qiita.com/seiya1121/items/cf6b44fae757f6300ada)

```
entries_path←そもそも指定していないメソッドが無いと言われるエラー

<%= form_with url: entry_path, local: true do |f| %>から
<%= form_with model: @entry, local: true do |f| %>へ変更するも

<エラー文:undefined method `entries_path'>が出た。

解決方法
=>>「form_with」では単数形のパスを生成してくれない。
Prefixで「entry」としていたため、上記のようなエラーが出た。
以下のようにurlを追加してあげて解決した。
<%= form_with model: @entry, url: entry_path, local: true do |f| %>
```
[【Rails4】form_forは単数形のパスを生成してくれないらしい - Qiita](https://qiita.com/yoskmr/items/cc8a2dc51c928aa1c87a)

 


エラーの解決をしました。
```
①[localhost:3000/job_offers/2] までは動作するが、
②[localhost:3000/job_offers/2/entry] が上手く動作しない。

今回、原因は
①@entry が nil というのと
②@entry = Entry.new が nil ではないということを理解していなかった。
=>newアクションで空のインスタンスを生成していなかった。

binding.pry(バインディングプライ)を使って、エラーを解決していった。
>>next
次の動作へ映る
>>continue
置いたbinding.pryをスルーさせる

①[localhost:3000/job_offers/2]の終わりから、順に一つずつ動作確認をしていった。最初は②[localhost:3000/job_offers/2/entry]の関連するコードばかり見ていて、エラーを探していたがその前の①→②へ受け渡すところでエラーが出ていた。一つずつ見ていくことを学んだ。
```
```

4: def new
5: # binding.pry
6: @job_offer = JobOffer.find(params[:id])
7: @prefectures = Prefecture.all
8: @municipalities = Municipality.all
9: @current_occupations = CurrentOccupation.all
10: binding.pry
=> 11: @entry = Entry.new →ここ以前までの処理はしている
12: binding.pry
13: end

[1] pry(#<EntriesController>)> @entry
=> nil
[2] pry(#<EntriesController>)> next

4: def new
5: # binding.pry
6: @job_offer = JobOffer.find(params[:id])
7: @prefectures = Prefecture.all
8: @municipalities = Municipality.all
9: @current_occupations = CurrentOccupation.all
10: binding.pry
11: @entry = Entry.new
=> 12: binding.pry   →ここ以前の処理はしている。
13: end

[2] pry(#<EntriesController>)> @entry
=> #<Entry:0x00007fe8667ade50
→ Entry.newして nil じゃなくオブジェクトなっている。
id: nil,
frirst_name: nil,
last_name: nil,
frirst_name_kana: nil,
last_name_kana: nil,
gender: nil,
birth_date: nil,
postal_code: nil,
prefecture_id: nil,
municipality_id: nil,
street_and_building_name: nil,
phone_number: nil,
mail_address: nil,
current_occupation_id: nil,
created_at: nil,
updated_at: nil>
```

# 12月21日

リロード(reload)は一つ前のHTTPリクエストに戻って再度処理を行う。
`redirect_to`を使うと、HTTPリクエスト(URLを表示して)をサーバーに送り、ユーザーはそこから返ってくるHTMLが表示される。わざわざ`redirect_to`を使っているかというと、成功処理を一回だけ行うため。何回も`save`して`mail`を何度も送ることを防ぐため。
[railsのrenderとredirect_toの違い - Qiita](https://qiita.com/1ulce/items/282cccba1e44158489c8)


POSTリクエストで送ったのに、リロードするとGETリクエストになってた。rails のターボリンクスが悪さしていたようだった。
[Rails 4 で turbolinks をオフにする方法 - Qiita](https://qiita.com/kazz187/items/12737363d62b9c91993c)


ja.ymlをダウンロードする方法(下記コマンドを実行する)
ダウンロードしたjs.ymlを「./config/locale/」の以下に入れる。
`$ curl -s https://raw.githubusercontent.com/svenfuchs/rails-i18n/master/rails/locale/ja.yml -o config/locales/ja.yml`

 

`エラーメッセージ`などの日本語表記はできたが、エラーメッセージを項目ごとに表示したい。フォームビルダーを使用しながらやりたいがエラーが出たり、正しい使い方ができていない。
[Action View フォームヘルパー | Rails ガイド](https://railsguides.jp/form_helpers.html#%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%83%93%E3%83%AB%E3%83%80%E3%83%BC%E3%82%92%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA%E3%81%99%E3%82%8B)
を読んで、まずフォームヘルパーについて知ってからやるべき。

 

# 12月25日
`正規表現`と`Railsでの正規表現`は違う。

```
<%= form_with model: @entry, local: true do |f| %>
model: @entry を定義したら、
「selected: params[:entry][:current_occupation_id]」
のselected: のオプションを入れなくても良い。

>>「selected:」,「value:」を無駄にコードに書いていた。いろんなことを調べてはいたが、全然解決しなかった。「selected:」,「value:」がどんな使われ方をしているか。どうすれば使えるか。を調べたほうがよい。役割とかで検索すると全然出てこない。

>>必要か不必要かを調べるときに、htmlではどこを表すものかを考えて、検証でみながらやった。結果、「selected:」はhtmlではname属性を表してるものだと思ったので、「selected:」を消して、ブラウザでチェックした。name属性も消えておらず、「selected:」は不要と確かめられた。
```

```
カスタムメソッド

validates → validate(単数形) にする。


validate :birth_date_cannot_be_in_the_past

def check_the_birth_date_for_entyr
if birth_date.present? && birth_date > Date.today.prev_year(15)
errors.add(:birth_date, "15歳未満は応募できません。")
end
end

```

```
type="hidden"
非表示データを送信する
```

 

# 12月26日
```
>> @entry.send(:first_name)←引数をシンボルで読んでいる。
=> "tanaka"

>> @entry.send("first_name")←引数を文字列で読んでいる。
=> "tanaka"
```

```

>> b ={tanaka: "tarou"}
=> {:tanaka=>"tarou"}
>> a ={tanaka: "tarou"}
=> {:tanaka=>"tarou"}

>> a.each {|k,v| puts "#{k.object_id}:#{v.object_id}" }
70343394547620:70343372736560
=> {:tanaka=>"tarou"}
>> b.each {|k,v| puts "#{k.object_id}:#{v.object_id}" }
70343394547620:70343359595160
=> {:tanaka=>"tarou"}

:tanaka(シンボル) オブジェクト番号は一緒だが
"tarou"(文字列) オブジェクト番号は違う

```

[Ruby on Rails 4 - rails helper でリンク付きのリストを作りたい|teratail](https://teratail.com/questions/21628)
[content_tag - リファレンス - - Railsドキュメント](http://railsdoc.com/references/content_tag)
```
content_tag
=>[content_tag],[concat]を使ってviewで表示する。
```

<helper>
```
def error_message(attribute)
if @entry.errors.as_json(full_messages: true)[attribute].present?
content_tag :ul do
@entry.errors.as_json(full_messages: true)[attribute].map do |message|
li_tag = content_tag(:li, message)
concat(li_tag)
end
end
end

ヘルパー内のerrorでもerrors内にはvalidateから出されるerrorも入っている。
カスタムバリデーションのときに自分で、[:municipality_id]と[:municipality]を設定しているので、エラー文が出せてなかったので、揃えるとエラー分がでる。
```

# 12月27日
```
params = (:first_name, :last_name, :mail_address, :job_offer_id)


def entry_params
params.require(:entry).permit(:first_name, :last_name)
end

entry_params では
[params]というインスタンスに[require]、[permit]というインスタンスメソッドを使って、許可したカラムだけのentry_paramsを作成している。

entry_params = (:first_name, :last_name)
paramsからpermitした値だけパッケージングする感じになる。
```


```
module EntriesHelper
def error_message(attribute)
if @entry.errors.as_json(full_messages: true)[attribute].present?
content_tag :ul do
@entry.errors.as_json(full_messages: true)[attribute].map do |message|
li_tag = content_tag(:li, message)
concat(li_tag)
end
end
end
end
end

↓↓↓
module EntriesHelper
def error_message(entry, attribute)
if (messages = entry.errors.as_json(full_messages: true)[attribute]).present?
content_tag :ul do
messages.map do |message|
li_tag = content_tag(:li, message)
concat(li_tag)
end
end
end
end
end

```

 

```

郵便番号:<%= f.text_field :postal_code, placeholder: "1234567" %><br>
<%= error_message(:postal_code) %><br>
↓↓
<%= error_message(@entry, :postal_code) %><br>
```