初心者がRails使っていて解決した備忘録

**記述の順番は自分がぶつかって、調べた＆解決した順番**


#Ruby

###`||=`の意味(使う)
自己代入→`a ||= 1 ` a が偽か未定義ならば1を代入。初期化時のイディオムの一種。


###クラス内でのself.の扱い方(特異メソッド)
参考サイト：http://rails.hatenadiary.jp/entry/2013/02/15/125047
今回は、sessionを用いたログイン実装で利用

```rb
def user.correct_password?(******)
```

で設定したものを別のクラスで

```rb
def correct_password?(input_password)
  self.password == input_password.to_s
end
```

として、selfで　元のクラスにあった、userをそのまま持って来れる(今回では、配列が入ったオブジェクトとしてuserを定義し、selfで持ってきた)

この場合はselfは疑似変数と呼ばれる

クラス内でのインスタンスメソッドの動きについては、こちらが分かりやすい
http://blog.livedoor.jp/sasata299/archives/51302623.html
selfがどのように、利用されているかが実行結果で分かる
※ちなみにjavaではthisというらしい
http://ja.wikipedia.org/wiki/This_%28%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%29

###特異メソッドについて(参考サイト)
さらに、クラスメソッドとインスタンスメソッドについては、こちらでも
http://nigohiroki.hatenablog.com/entry/2014/03/12/010344
> クラスメソッドの場合
> 
> - Dogのうち一番年齢の高いDogを取り出すメソッド
> - Dogのうちオスのみを取り出すメソッド
> 
> 例えばこんな感じ
> 
> ```rb
> class Dog < ActiveRecord::Base
>     # 一番年齢の高いDog
>     def self.get_oldest
>         self.order("age DESC").limit(1)
>     end
>     # オスのみを取り出す
>     def self.get_male
>         self.where(:sex => "male")
>     end
> end 
> ```
**要は「クラス全体の中から何かを取り出す」場合などに利用されます。**

###インスタンスメソッドの場合
とあるDogの年齢、性別をHashで取り出すメソッド
とあるDogの親のDogを取り出すメソッド(親が子のIDを持っているケース)

```rb
class Dog < ActiveRecord::Base
    # 年齢、性別
    def get_profile
        { :age => self.age, :sex => self.sex } 
    end
    # 親を取り出す
    def get_parent
        Dog.where(:child => self.id)
    end
end
```
こちらは「あるインスタンスの何かを取り出す」場合などに利用されます。インスタンスメソッドの場合は更新系もよく出てくるかと思います。

###class << self(特異クラス)について
参考サイト：http://magazine.rubyist.net/?0046-SingletonClassForBeginners
> ```rb
> class Bar
>   def hello
>     puts 'hello'
>   end
>   class << self
>     def bye
>       puts 'good bye'
>     end
>   end
> end
> 
> Bar.new.hello #=> hello
> Bar.bye       #=> good bye
> ```

`Bar.bye`は`Bar`クラスに対する特異メソッド(=`Barクラス`のクラスメソッド)なので`Bar`をレシーバとしてメソッドを呼び出せる。

###present?でnilでないかどうかの判定
参考サイト：http://techracho.bpsinc.jp/baba/2011_11_26/4724
なるべく、否定である`!`は書かないようにとのこと

###メソッドの最後に!や?をつけるのは？？？
そのメソッドが判定を行ったり、何かやっていない状態での動作などを表すため
ex.
ログインをして'いない'状態でログインを求めるメソッド名

```rb
def require_login!
```

パスワードが一致しているかどうかを判定して、ture or false を返したい場合

```rb
def correct_password?
```

###インスタンス変数とローカル変数のスコープの違い
ローカル変数よりインスタンス変数の方がスコープの範囲が長い
参照サイト：http://docs.ruby-lang.org/ja/2.0.0/doc/spec=2fvariables.html
> ローカル変数のスコープは、((*宣言した位置から*))その変数が宣 言されたブロック、メソッド定義、またはクラス/モジュール定義 の終りまでです。寿命もそのブロックの終りまで(トップレベルの ローカル変数はプログラムの終了まで)ですが、例外としてブロッ クが手続きオブジェクト化された場合は、そのオブジェクトが消滅 するまで存在します。同じスコープを参照する手続きオブジェクト 間ではローカル変数は共有されます。 


###いまさらながら、ruby の　putsでつまずいた部分
`puts`
 のについては、あらかじめ型の宣言がされていないのでstringとintegerは同居できないのでそのなかで型宣言(to_s)とかをやってあげないといけない
to_i.to_sで端数の切り捨てもできる

###別クラスからメソッドを利用したいとき
クラス名.メソッド名(引数) 
→引数はある場合のみ
※ただし、イニシャライズが必要な場合はイニシャライズしておくこと

ex.

```rb:client_user_logins_controller.rb
class ClientUserLoginsController
SentMail.reset_password_to_mail(user)
end
```
###superメソッドって?
クラスの継承を行った際に継承元と同じメソッド名の処理を引っ張ってこれるメソッドのこと

>```rb:
>class Car
>  def accele
>    print("アクセルを踏みました¥n")
>  end
>end

>class Soarer < Car
>  def accele
>    super
>    print("加速しました¥n")
>  end
>end
>
>```

これで、Soarerクラスのacceleメソッドを実行するとCarクラスのacceleメソッドで定義している処理も実行できる

参考url: http://www.rubylife.jp/ini/inherit/index3.html

###一致するデータがあるか調べるとき
include?メソッドを使って調べる(arrayで)

```rb:
member = [1,2,3]
member.include?(1) #=> true
member.include?(4) #=> false
```

###include?メソッドについて
include?メソッドはarrayクラスとstringクラスにはあるメソッドだが、integerにはないので、単一の数字を含んでいるかどうかの確認は == を用いて確認

###parseとは？
jsonなどで取得した結果を見てみると分かるが、parseすることでkeyとvalueに分けてくれる
例えば、

```rb:
member = Member.first.to_json
 #=> "{\"id\":1,\"email\":\"reda.dsajpsa@gmail.com\",\"name\":\"ユーザー\",\"image_file_name\":null,\"image_content_type\":null,\"image_file_size\":null,\"image_updated_at\":null,\"kana\":null,\"password\":null,\"entry_year\":null,\"chatwork_id\":\"\",\"birthday\":null,\"indoor_call\":null,\"profile_message\":null,\"hobby\":null,\"job\":null,\"main_department_id\":null,\"created_at\":\"2015-08-05T14:13:35.000Z\",\"updated_at\":\"2015-08-08T07:49:06.000Z\",\"provider\":null,\"uid\":null,\"token\":null}"

```
この結果をparseすると

```rb:
hash = JSON.parse(member)
 #=> 
{"id"=>1,
 "email"=>"reda.dsajpsa@gmail.com",
 "name"=>"ユーザー",
 "image_file_name"=>nil,
 "image_content_type"=>nil,
 "image_file_size"=>nil,
 "image_updated_at"=>nil,
 "kana"=>nil,
 "password"=>nil,
 "entry_year"=>nil,
 "chatwork_id"=>"",
 "birthday"=>nil,
 "indoor_call"=>nil,
 "profile_message"=>nil,
 "hobby"=>nil,
 "job"=>nil,
 "main_department_id"=>nil,
 "created_at"=>"2015-08-05T14:13:35.000Z",
 "updated_at"=>"2015-08-08T07:49:06.000Z",
 "provider"=>nil,
 "uid"=>nil,
 "token"=>nil}

```
という形で直してくれる


###文字列を用いてメソッドを呼び出したいとき
sendを使う

```rb:
member.name
 #=> 'sample'
member.send('name')
 #=> 'sample'
```

###クラスメソッドについて
self.で継承してきたメソッド内では他のメソッドへ処理を渡せなかった。
解決方法としては、self.をやめて一旦、イニシャライズしてから通常のようにメソッドを渡す。

#Model

###model間のリレーションについて
model間のリレーションについては、migrationファイルではなく、modelのクラス名を基準に行う

マッチしているものをすべて取ってきたい場合はfind_byではなく、こちらを利用する
→find_byだとunsupported: Symbolというエラーが返ってきてしまう 

###scopeメソッドの引数部分

```rb:Model.rb
scope :name_like, ->(name)  { where('name like ?', "%#{name}%") if name.present? }
```

この場合だと->(name)のname部分が引数になる

###テーブルの自己結合(n:n)を実装する方法
テーブルでindexづけして重複を防ぐやり方

- indexづけ、最後は重複を防ぐためのもの

```rb:migration.rb
add_index :favorites, :favoriting_id
add_index :favorites, :favorited_id
add_index :favorites, [:favoriting_id, :favorited_id], unique: true
```

モデルのリレーションの書き方
フォロー関係を作成するモデル

```rb:Follow.rb
belongs_to :follower, class_name: "User"
belongs_to :followed, class_name: "User"
```

元テーブルのモデル

```rb:User.rb
has_many :user_follows, class_name: "UserFollow", foreign_key: :user_id
has_many :follows, through: :user_follows
has_many :user_followers, class_name: "UserFollow", foreign_key: :follow_id
has_many :followers, through: :user_followers
```

class_nameは対象となるモデルを指定して，foreign_keyで，どのカラムの値が一致するレコードを取得するのかを指定します．

参考URL:http://qiita.com/youcune/items/ec1d0b34bd542d8c7f2f
http://h3poteto.hatenablog.com/entry/2014/06/15/231742

###newとbuildとの違いは？
ActiveRecordでの挙動が違ってくる
参考URL: http://rubyonrails.gachinko.org/3-1/build/
> newは対象のモデルのインスタンスを生成するおなじみのメソッドである。
> 
> ```rb:new.rb
> @comment = Comment.new
> #=> Comment id: nil, name: nil, body: nil, article_id: nil, created_at: nil, updated_at: nil
> ```

一方のbuildはActiveRecordアソシエーションを扱う類のメソッドである。
newメソッドのようにインスタンスの生成を行えるが、親モデルに対する外部参照キーを自動でセットしてくれるところがnewメソッドと異なる。

```rb:build.rb
Article.create(:title => 'テスト記事タイトル', :body => 'テスト記事本文')
@article = Article.find(1)
@comment = @article.comments.build
#=> Comment id: nil, name: nil, body: nil, article_id: 1, created_at: nil, updated_at: nil
```

###controllerにおいて、レコードの取り出し方が共通で複数ある場合はmodelに
ex.新しいレコードを5件取り出す
→scopeメソッドを用いて、modelに記載

```rb:member.rb
 scope :latest_member, -> (latest_number = 5) { order(created_at: :desc).limit(latest_number) }

```

ex.自分が所属しているコミュニティを上位5件

```rb:community.rb
  scope :community_for_ui, -> (my_accout, limit = 5) { where(member_id: my_accout.id).limit(limit) }
```
my_account => current_member(current_memberはログインしているユーザー)

###updateの際にcall_backを回避する方法
別途メソッドを作る(今回の対処)
こんな感じ。

```rb:article.rb
def update_curator(add_curator)
  unless set_article_curator = ArticleCurator.find_by(article_id: self.id)
    set_article_curator = ArticleCurator.create(article_id: self.id, user_id: add_curator.id)
  end
  set_article_curator.update_column(:user_id,add_curator.id)
end
```
ちなみに、スキップするメソッドを用いるのではなく、ある条件下でcall_backをスキップする書き方は、以下を参考

```rb:writer.rb
class Writer < Person
   skip_callback :validate, :before, :check_membership, if: -> { self.age > 18 }
end
```

参照サイト:http://api.rubyonrails.org/classes/ActiveSupport/Callbacks/ClassMethods.html#method-i-skip_callback

ポイントはupdate_attributesなどをするとcall_backをskipできないのでupdate_columnで対応した
※ちなみにupdate_attributesは引数を1つで通るが、update_columnは引数が2つ必要なので
`update_column(user_id: self.id)`
という書き方はできず、
`update_column(:user_id, self.id)`として引数を2つとして渡さないと動作しない
call_backをスキップできるupdateメソッド一覧
http://www.techscore.com/blog/2012/12/25/rails%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E3%81%BE%E3%81%A8%E3%82%81/

>以下のメソッドはコールバックを実行しません。
    decrement
    decrement_counter
    delete
    delete_all
    find_by_sql
    increment
    increment_counter
    toggle
    touch
    update_column
    update_all
    update_counters



#Controller

###別コントローラーへのparamsの受け渡し
参考サイト：http://qiita.com/hmuronaka/items/f27219d408d0b70d3f4d

###indexのviewなどでハッシュの表示まで行われているとき
チェック　→

```erb
<%= ***.each do |t| %>
```

のように、=が入ってしまっていることが原因

###eachを回している場合のlink_to のpathについて
`link_to '詳細', client_path(client.id)`のように、入れ子の変数について要素の指定をしなければならない

###link_to タグないに特定の式を代入して使いたいとき

```erb
<%= link_to ***** , ***%>
```

のように、名前はダブルコーテーションで囲まなくても使える→というか囲んだら使えない

###画像アップロード方法(今回はこっちを利用)

```erb:_form.html.erb
<%= form_for( @image, :html => { :multipart => true }) do |f| %>

<%= f.label :image %>
<%= f.file_field :image %>

<% end %>
```

> 画像(jpeg)をアップロードして DB に格納する  一覧画面で表示する\


###画像アップロード？
参考サイト：http://dev.classmethod.jp/server-side/ruby-on-rails/ruby-on-rails_image_controller/


###paramsの配列表記
sessionの値、引き渡しで利用
`params[:session]`→これでセッションがどのような配列になっているか確認できる
`params[:session][:要素名]`→これで、セッション内の要素の取り出しができる
※ちなみに、ここの:sessionとかはcontrollerの名前である場合が多い(指定すれば別。検索クエリの:qとか)

###急にindexの表示でエラーが出たときの対処法(はまった)
エラーは、undefined method *** と通常のもの
→原因 nullが返っているカラムについて、link_toと関連づけていたため、エラーが発生していた
→対処　`.try(:+++)`で入っている場合のみ、値を返す処理で対処
動作がカラムもので、null false ありきのものだと、try(:+++)を設定するべき

###基本的なsessionの扱い方
参考サイト：http://ruby-rails.hatenadiary.com/entry/20141130/1417334030

###findの中で検索の条件を用いたい場合
find_byメソッドの利用
http://ruby-rails.hatenadiary.com/entry/20141130/1417334030
今回は、ログイン時に代入されたセッションをもとに、ユーザーの検索&代入を行うため
※ちなみに返ってくるレコードは１件

###アプリの共通動作を設定したい場合
application_controllerで設定
http://whitech0c0late.hatenablog.com/entry/20120128/1327759552
railsの継承関係を確認

###n:nテーブルの記載についてストロングパラメータの注意点
参考サイト:https://github.com/rails/strong_parameters/blob/master/README.md

`:tag_ids => []`
のように、ハッシュ表示が必要

####(再確認)renderとredirect_toの違い(今回のパターン)
renderで渡さなければ、その前のメソッドで引数を渡した場合のものも反映されない
→renderで渡せばその前の引数などの移行も可能
redirect_to で移行してしまった場合、メソッド間の引数などの受け渡しができない


###privateメソッドにすると・・・
viewにデータが入らない

###updateメソッドとしてurlを使いたい場合は、どうする？
ルーティングで

```rb:route.rb
patch 'reset_password/:id', to: :reset_password_set
```
というように、patchをセットしてあげる

###toggleボタンでの切り替え状況をDBへ更新する
手順：
特定のcontroller内に実行されるとbooleanを反転させる処理(アクション)を作成
→viewにcheck_box_tagを使用し、そこでチェックが入るとidが出力されるように設定(ここでは入れ替えたいテーブルのid)→jsを使ってcheck_boxが押されたら(input=check_box)予め設定されているURLを叩く→叩いたURLでidを渡す&actionの実行を行う
参考サイト：http://qiita.com/fujimohige/items/192d7a3c32e2acd42129


###findメソッドの代わりに、whereを用いると書き方はどうなる？(条件式での絞り込み)
参考サイト：http://qiita.com/merrill/items/8ec158953cb4c2715c7b
今回使ったのは、これ
>指定した条件に合致するレコードをすべて取得する。

```rb:where.rb
User.where(name: 'taro')
```
=> SELECT `users`.* FROM `users` WHERE `users`.`name` = 'taro'

###Helper処理の使いどころ
例外処理？や各タイミングで利用する処理はHelperにまとめて書いていく。そのあと、helperをapplication_controllerへincludeしてあげる
ex.
ログインしているユーザーの状態保持の明示
ログインを行っていなかったら、ログインするようにpathに飛ばす

###!や?をどのような意味で使うか
!はオブジェクトそのものを書き換える場合
?は戻り値がture or falseかの場合

#View

###viewについてhashを取り出す際にいつも忘れがち
必ずeach文をつけて行う
ex.

```html+erb:tag.html.erb 
<% @active_report.tags.each do |tag| %>
  <%= tag.try(:id) %>
<% end -%>
```

```rb
code
```

###nnテーブルを用いた新規ファイルの登録についての注意
viewによっては、nullでエラーを吐き出すので登録&nullの設定には、注意が必要

###<%=  %>と<%  %>の違い
<%=  %>は実行結果を表示(htmlへ出力)
<%  %>は実行結果を表示しない

###rails4からの:confirm廃止について
参照サイト：http://rails.takayukikoyama.com/rails4-1/link_to-confirm-abolition/
>　廃止と言われても、確認もなしに削除してしまうのは困る。しかし、aタグをベタ書きしなければならないかというとそうではなく、ただ書き方を変えればいい。Rails4.1ではdata:オプションを使って以下のように書くと正常に動作する。

###form_for で特定の要素しか入れない場合の書き方
```erb
<%= form_for @reset_password.password do |f| %>
```

のように、特定のものだけ指定してあげないと、ハッシュとして受け取ってしまうため、formが表示できない

###form_forで入れたデータはどう見る？
paramsに配列として格納されているので、入力値で指定した:emailの様に、params[:email]と要素を指定してあげる

###純粋なフォームのみのものからpostしてきたデータを確認したいとき
サーバーがログを吐いているのでそこを確認

###imageを一覧表示
iamgetagを使う
> 「public」ディレクトリ直下に画像ファイルを設置した場合:
> 
> ```erb
> <%= image_tag '/flower.png' %>
> ```
> --> <img alt="Flower" src="/flower.png" />


###form_forの後に指定するurl: pathの意味
ここはpost先のactionを指定するためのpath設定



###layoutsの中でパーシャルを利用する場合の注意点

普通は、`<%= render 'header' %>`
などでも通るが、layouts内でパーシャルを利用したい場合は`<%= render 'layouts/header' %>`というようにパス指定の一番始めにlayoutsをつけてあげないとうまく動作しない

###boolean型のデータを出力する際のtrueとfalse以外の表示にするやり方
`<%= post.sex ? '男性' : '女性' %>`
出力の中で?(スペースは空ける)を取るとif文としてかける。→やっていることは、sexカラムがtrueかfalseか返しているだけ

参考サイト：http://banker0507.blogspot.jp/2012/07/booleantruefalse.html

###formで初期値を入れておく方法
→paramsで特定の値を入れて送りたいときなど、役立つ(今回はchek_boxでチェックされたら値が入ってcontrollerに飛ぶように設定した)
>入力:  `<%= text_field_tag 'word', @word, placeholder: "入力してください", class: "form-control input-search-word" %>`
出力: `<input class="form-control input-search-word" id="word" name="word" placeholder="入力してください" type="text" value="HelloWorld" />`

参考サイト: http://easyramble.com/text-field-tag-default-value.html

###form_forでモデルの指定をしないでフォームを作る
```rb
form_for (:category, url: +++) do |f|
f.hidden_field 'data', value => 1
(or) f.hidden_field :data, :value => 1
f.submit
end
```
この場合だとurlで指定した場所にparams[:category][:data] => 1が入った状態で送られる

```rb
form_tag('user/sign_in') do 
end
```
のような書き方もあり

###formの初期値などの入力についていろいろ

```rb
#field検索の場合
:placeholder => "#{params[:q][:name_cont]}" #初期値を入れる場合
#selectの場合
:include_blank => true #空欄をセレクトの中に含む場合
:selected => 2 #初期選択をする場合
:prompt => "選択してください" #空欄の時に初期値として表示する文言
```

###パーシャルでformを扱う場合の注意点
参考サイト:
http://avosalmon.hatenablog.com/entry/2014/07/05/%E3%80%90Rails%E3%80%91form_for%E3%81%AE%E4%B8%AD%E8%BA%AB%E3%82%92partial%E3%81%AB%E3%81%99%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AE%E6%B3%A8%E6%84%8F%E7%82%B9

rederで渡す際に引数としてフォームで利用している変数も渡す

```rb
<%= render 'tag_select_desktop', f: f %>
```
#Migration

###databaseへ画像を保存する場合に必要なテーブルについて
参考サイト:http://railsdoc.com/migration
>カラムの型
データ方	説明
string	文字列
text	長い文字列
integer	整数
float	浮動小数
decimal	精度の高い小数
datetime	日時
timestamp	より細かい日時
time	時間
date	日付
binary	バイナリデータ
boolean	Boolean型\
画像のファイルについては、バイナリデータで処理

###tableの書き直し
`rake db:migrate:reset` or `rake db:reset`→`rake db:migrate`(※ただし、migrate:resetの場合は、再度、migrateする必要なし)

###`rake db:seed`での重複について

```sh
rake db:seed_fu
```

で対応
参考サイト:http://qiita.com/ko2ic/items/be96e450a33d631e0059
>railsにある仕組みとして rake db:seed があります。
これは、何も考えずに使うと実行するたびに同じデータが登録されてしまいます。
そこで、代わりにseed-fuを利用するわけです\

###rake db:seedを実行する際の謎のエラー

```
(in /Users/V/Documents/******/******/******(アプリケーションフォルダ名))
rake aborted!
NameError: uninitialized constant Category
/Users/*********/Documents/******/******/******(アプリケーションフォルダ名)/db/seeds.rb:33:in <top (required)>'Tasks: TOP => db:seed
```
→参考サイト: http://easyramble.com/rake-uninitialized-constant-error.html

解決策
**tableの作成は、migrationファイルでできるが、データ操作(ここなら、seedファイルの流し込み)を行う場合は、modelに独自でファイルを作成しないといけない**
→migrationファイルのクラス名は複数
→modelのファイルのクラス名は単数
→コンソールなどから、クラス名.createする時は、model に書かれたクラス名から呼び出している
→よって、`seeds.rb`に書き込む場合、ファイル名ではなく、クラスの名前で書き込むことに注意

####DB設計について(テーブルを作成する基準は何か？)
*同時に情報を追加するものかどうか？
*情報の追加がなく、選択式の項目なのか？(例えば、性別などはあらかじめ項目が決まっており、後から追加するものではない)

###mysqlを用いたseeds.rbのデータ流し込みの際に注意すること
使用する文字コードの設定
参考サイト：http://www.dbonline.jp/mysql/myini/index3.html
→**modelファイル作成の際に継承するもとのクラスが間違っていた(migrationは、`ActiveRecord::Migration`だが、modelの作成については、`ActiveRecord::Base`)**rake db:seedについては、情報の操作を行うので、modelファイルが必要

###migrationファイルの書き換えを反映させたい場合
`rake db:reset`ではなく、
`rake db:migrate:reset`
からのmigrate を行わないとうまく反映されない

###n:nテーブルでの初期設定
参考サイト：http://rails.densan-labs.net/form/many_to_many_form.html

###dbにadd indexする意味
>特定のカラムからデータを取得する際に、テーブルの中の特定のカラムのデータを複製し検索が行いやすいようにしたものです。
例えば、あるユーザーをバイネームで検索したい！となった際に、Usersテーブルのnameカラムにインデックスを張ってないと、プログラムは、Userテーブルのnameカラムを上から順にみて、そのユーザーのデータを取得します。もし、これが1万人もしくはそれ以上の大量のデータを含むカラムだったらどうでしょう。すごく時間がかかりますね。
Usersテーブルのnameカラムにindexを張ることで、アルファベット順にnameを並べ替え検索しやすいようにしてくれます。

参照サイト: http://qiita.com/seiya1121/items/fb074d727c6f40a55f22

###これまでのmigrationの履歴をチェックしたいとき
```rb
rails c
ActiveRecord::Migrator.get_all_versions
```
そこから調べた特定のversionに戻したいときは

```rb
 rake db:migrate:redo VERSION=20150804093959
```


#Gem

##localにあるgemの場所を調べたい時
`gem environment`と打てば、pathなどの情報が出てくる
gem関連のコマンドについては
`gem help commends`で検索

###bundle install の際にpathの入力を省略したい場合
>
~/.bundle/config を作り下記の内容を書いておくとok
`BUNDLE_PATH: ./vendor/bundle`
また bundle config で設定の内容を確認できる


引用サイト: http://qiita.com/toshiwo/items/4e7c82852f3e14bf5a1d

###検索機能の実装
gemを利用したもの
参考サイト：http://techracho.bpsinc.jp/morimorihoge/2013_07_26/12552
gemを利用しないもの
参考サイト：http://kazuph.hateblo.jp/entry/2012/10/06/222831

###ransackを使う際の注意点
基本の作り方: http://ruby-rails.hatenadiary.com/entry/20141008/1412774436
フォームの指定するカラムに_startや_contを入れないと動かない→検索方法の指定ができていないため

##Devise
###ログイン後のリダイレクトはデフォルトでどう設定されているのか？
deviseのgem本体にあるsession_controllerを見てみた。
参照url: https://github.com/plataformatec/devise/blob/master/app/controllers/devise/sessions_controller.rb

```rb:sessions_controller.rb
  # POST /resource/sign_in
  def create
    self.resource = warden.authenticate!(auth_options)
    set_flash_message(:notice, :signed_in) if is_flashing_format?
    sign_in(resource_name, resource)
    yield resource if block_given?
    respond_with resource, location: after_sign_in_path_for(resource)
  end
```
最後の部分に注目してみるとlocation:にafter_sign_in_path_for(resource)という形で、after_sign_in_pathで設定されている部分にリダイレクトすることがわかった。
自分の意図でしたところにリダイレクトさせたい場合はこのpathを設定すればいい。

###after_sign_in_path_for(resource)の設定の仕方について
Deviseを使っていてログイン後のリダイレクトを自分で設定したい場合のやり方
参考url: http://stackoverflow.com/questions/26435863/rails-devise-route-to-homeshow-after-login-using-after-sign-in-path-for

Deviseで作ったユーザーの種類が一つのとき

```rb:application_controller.rb
class ApplicationController < ActionController::Base

  private

  def after_sign_in_path_for(resource)
        homes_path
  end
end
```

Deviseで作ったユーザーの種類が複数のとき

```rb:application_controller.rb
class ApplicationController < ActionController::Base

 private

 def after_sign_in_path_for(resource)
    if resource.is_a?(YourDeviceModel)
        homes_path
    else
        another_path 
    end
 end
end
```

###modelでもDeviseで定義されたcurrent_userメソッドは使えるのか？
どうやら、modelでは使えないので、controllerから引数として渡してあげる方法しかないらしい。

以下、引用
This doesn't make much sense, as you already pointed. The current_user doesn't belong to model logic at all, it should be handled on the controller level.
But you can still create scope like that, just pass the parameter to it from the controller:

```rb:model.rb
scope :instanceprojects, lambda { |user|
    where("projects.instance_id = ?", user.instance_id)
} 
```

Now you can call it in the controller:

```rb:controller.rb
Model.instanceprojects(current_user)
```

参考url: http://stackoverflow.com/questions/3742785/rails-3-devise-current-user-is-not-accessible-in-a-model

###Deviseを使ってログインした場合のユーザー情報はsessionのどこに入っているのか？
こういう感じで入っている部分があるらしい(sessionの一番大元のhash)

```rb:
{"session_id"=>"be02f27d504672bab3408a0ccf5c1db5", "_csrf_token"=>"DKaCNX3/DMloaCHbVSNq33NJjYIg51X0z/p2T1VRzfY=", "warden.user.user.key"=>["User", [3], "$2a$10$5HFWNuz5p6fT3Z4ZvJfQq."]}
```

なので、このsessionを保持しているユーザーを引張りだしてくる場合は、

```rb:
User.find(session["warden.user.user.key"][1][0])
```
こんな感じで取り出すとのこと
参考url: http://stackoverflow.com/questions/10338692/how-can-i-find-a-devise-user-by-its-session-id


##rake
###rakeに新しいコマンドを作成する方法
lib/tasks(pathを通しておく必要があるかも)にrakeファイルの作成
ex.rake db:backupでDBのバックアップを取りたいとき

```rb:backup.rake
namespace :db do
  task :backup do
    system "mysqldump --opt --user=root --password=***  db_develop > db_backup/#{Date.today}db_backup.sql"
  end
end
```

※バッチファイルのpathの通し方
config/application.rbに記載

```rb:config/application.rb
    config.autoload_paths += Dir["#{config.root}/lib/tasks"]  #バッチファイルを使うためのpathを通す
```

###wheneverで定期的にバッチファイルを回す
手順:
1. Gemfileにwheneverの追加
2. whenever .　のコマンド実行→これでconfig/schedule.rbができる
3. schedule.rbの中に行いたい記述
ex.

```rb:schedule.rb
every 3.hours do
  rake "db:backup"
end
```
これで3時間ごとにdbのバックアップを取る(rake コマンドは自分でカスタマイズしたもの)

挙動を確認する際には、`whenever`とコマンドを打てば分かる
#Error

###はまったところ
参考サイト：http://stonhair.blogspot.jp/2011/10/railsnameerror-uninitialized-constant.html

###rails s　での謎のエラー
発生したエラーと同様のもの：https://github.com/rails/rails/issues/11063
→結果、 `rails servre -h` を複数回繰り返しorパソコン再起動をしておくと、なぜかうまく行った

###wrong number of arguments (a for b)の意味
引数とメソッドに渡すべき引数の数があってないらしい
参照サイト：http://qiita.com/toshimitsu-miyachi/items/82417ab6126d816af4e4

###rails s でwrong number のエラーが出て立ち上がらない場合の対応
参照サイト：http://www.ark-web.jp/sandbox/wiki/284.html
config/enviroments/prdouction.rbのコメントアウト

###twitter-bootstrap-railsを入れようとしたら、レポジトリにないよ！って言われたときの対処
Gemfileに記載したが、githubのファイルを直接指定してインストールするとできた

```rb:Gemfile
gem 'twitter-bootstrap-rails', :git => 'git://github.com/seyhunak/twitter-bootstrap-rails.git'
```

入れ終わったらこのコマンドでアセットパイプラインの生成

```sh
rails generate bootstrap:install static
```

参照サイト：
https://github.com/seyhunak/twitter-bootstrap-rails

###部分的に挙動を確認したいとき
止めたいところに`fail`と書き込めばオッケー


#Routing
###routingを行う際にresousesの注意点
resousesで設定してしまうと、余計な要素が入ってしまう(:idとか。。。)
個別なものを設定したい場合は、以下のように

```rb:routes.rb
resource :admin_user_login, path: :admin, only: [] do 
    get  'login', to: :new
    post 'login', to: :create
    get  'logout', to: :destroy
end
```

=>

```
   login_admin_user_login GET    /admin/login(.:format)             admin_user_logins#new
                         POST   /admin/login(.:format)             admin_user_logins#create
 logout_admin_user_login GET    /admin/logout(.:format)            admin_user_logins#destroy
```
要は、途中によけいな:idなどが入らない


###deviseを使ったときのlogout_pathのルーティングエラー(純正controllerのdestroyに飛ばされる問題)
[devise のlogout_path設定で純正のdestroyアクションに飛ばされる問題]
[原因]logout_pathがdeleteになっていること
[対処]ルーティングを書き直してlogout_pathをgetにしてあげる

```rb:routes.rb
devise_scope :members do
    get 'logout' => 'devise/sessions#destroy'
end
```

###pathとurlの実行結果の違い
```rb
root_url
#=> "http://localhost:3000/"
root_path
#=> "/"
```

#Git
###gitのremote add がうまく行かないとき
参考サイト：http://d.hatena.ne.jp/iwahei0813/20140324/1395652080
一回、`git remote rm origin`で登録を消す

###gitの特定のローカルブランチから特定のリモートブランチへpushするやり方
ただし、実際のやり方は origin リモート：ローカルだった。(pullしようとした時)

ローカルブランチがmacという状態で

```sh
git push origin master
```

としても、既にupdate済みだよ！となってしまうので、
こちらのコマンドで対処

```sh
git push origin mac:master
```

この場合はローカルのmacブランチからリモートのmasterブランチへpush している様子
>実は以下のような意味になります。
ローカルのhogeブランチをリモートのhogeブランチにpush！です。
コマンドに落としこんでみましょう。
`git push {ローカルのhoge}:{リモートのhoge}`
２ヶ所あったhogeは前者がローカルブランチ、後者がリモートブランチです。
（git push origin hogeはリモート・ローカルのどちらもhogeを指定する、という省略した書き方だったのです！）
これさえわかれば、例えばこんなことも。
`git push origin master:test`
ローカルのmasterブランチをリモートのtestブランチにpushしています。
ローカル作業中に間違えてmasterブランチでコミットしていた！といった場合に使えそうです。
（ローカルでブランチ整理してからpushするほうが安全そうではありますが...）

参考サイト：http://shoma2da.hatenablog.com/entry/2014/03/08/234523

###commitの巻き戻し
```sh
git reset --hard ***********(commitのHEAD)
```

#その他

###mailの送付機能実装
今回は、パスワードの再設定をメールを用いて行う参考サイト：http://ruby-rails.hatenadiary.com/entry/20140828/1409236436
手順

1. パスワード再設定ボタンを押す
2. メールアドレス入力画面に移行
3. 入力されたメールアドレスからユーザーを検索
4. ヒットしたユーザのパスワード編集の状態を準備
5. メールにパスワード再設定画面のURLを送付
6. パスワードの編集を行う→アップデート
7. DBへ情報のアップデートを行う

Mailerクラスメソッドを用いて呼び出し

###Mailerを用いる際に気をつけておくこと
【Gmail】を用いて使う場合
※Gmailの２段階認証(電話を用いた)を行っていることが前提
https://support.google.com/accounts/answer/185833?hl=ja
このサイトから個別アプリのパスワードを生成して、config/environments/development.rb　への設定を変更する(パスワード)

###railsのアプリケーション上からはmailが送れないというエラー(コンソールからは送れる)
config/environments/development.rb
のmailer_deliverのエラー設定をtrueにすると解決

```rb
config.action_mailer.raise_delivery_errors = true
```

参考サイト：http://www.workabroad.jp/posts/2105

###バッチファイルの作成方法

1. 実行する内容を設定するファイルをlib配下に設置
2. pathを通すため、config/application.rbのmodule内にpathを通す内容を記載

[内容はこんな感じ]

```rb:application.rb
config.autoload_paths += %W(#{config.root}/lib)
```

###rails4からfind系メソッドがあまり勧められないことの疑問について
これが絶対的な理由とは限らないが、おそらくfindメソッドが実行された際に動作が起動するオブジェクトのインスタンス化がひとつの要因かも
流れ的にはfindメソッドからwhereメソッドへの切り替え
>find系メソッドの仕様が要注意で、
Railsのfind系メソッドは、そのオブジェクトが実際に使われるかどうかに関係なく、
検索してヒットした全てのオブジェクトに対して after_find をキックし、
検索してヒットした全てのオブジェクトをインスタンス化している（=> after_initialize をキックする）。

参考サイト: http://o.inchiki.jp/obbr/127

#Memo

####気づいたことメモ1

```rb
:data => {:confirm +++}
```

と

```rb
data: {:confirm +++}
```

は一緒？つまり、`=>` の省略をどうしているか？

###基本的な注意点(ファイルとクラス名)
クラス名とファイル名を一致させないと動かない
基本のGemfileはGemfile.lockに記載されているので、どうしても外したいものがある場合は、ここのファイルを編集しなければならない

###プロファイラの非表示
alt + p

###雑記
controllerとmodelの書き分け

ubuntu内で処理を中止するには、shift+ctrl+c

http://woshidan.hatenadiary.jp/entry/2015/03/25/223006

renderはあくまでviewで表示させるためのメソッド

**気づいたこと**
Model部分がまだまだ少ない。Controller部分の記述が多いことから、Railsの流れ？である「fat model skinny controller」が全然できていない。
「fat model skinny controller」の参考サイト: http://qiita.com/nashirox/items/edf5e8e9e7b8fc6891d3