LoginSignup
121
125

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-06-02

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

Ruby

||=の意味(使う)

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

クラス内でのself.の扱い方(特異メソッド)

参考サイト:http://rails.hatenadiary.jp/entry/2013/02/15/125047
今回は、sessionを用いたログイン実装で利用

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

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

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のうちオスのみを取り出すメソッド

例えばこんな感じ

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を持っているケース)

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

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.byeBarクラスに対する特異メソッド(=Barクラスのクラスメソッド)なのでBarをレシーバとしてメソッドを呼び出せる。

present?でnilでないかどうかの判定

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

メソッドの最後に!や?をつけるのは???

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

def require_login!

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

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.

client_user_logins_controller.rb
class ClientUserLoginsController
SentMail.reset_password_to_mail(user)
end

superメソッドって?

クラスの継承を行った際に継承元と同じメソッド名の処理を引っ張ってこれるメソッドのこと

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で)

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

include?メソッドについて

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

parseとは?

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

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すると

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を使う

member.name
 #=> 'sample'
member.send('name')
 #=> 'sample'

クラスメソッドについて

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

Model

model間のリレーションについて

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

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

scopeメソッドの引数部分

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

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

テーブルの自己結合(n:n)を実装する方法

テーブルでindexづけして重複を防ぐやり方

  • indexづけ、最後は重複を防ぐためのもの
migration.rb
add_index :favorites, :favoriting_id
add_index :favorites, :favorited_id
add_index :favorites, [:favoriting_id, :favorited_id], unique: true

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

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

元テーブルのモデル

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は対象のモデルのインスタンスを生成するおなじみのメソッドである。

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メソッドと異なる。

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に記載

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

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

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を回避する方法

別途メソッドを作る(今回の対処)
こんな感じ。

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をスキップする書き方は、以下を参考

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などでハッシュの表示まで行われているとき

チェック →

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

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

eachを回している場合のlink_to のpathについて

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

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

<%= link_to ***** , ***%>

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

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

_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
今回は、ログイン時に代入されたセッションをもとに、ユーザーの検索&代入を行うため
※ちなみに返ってくるレコードは1件

アプリの共通動作を設定したい場合

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を使いたい場合は、どうする?

ルーティングで

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
今回使ったのは、これ

指定した条件に合致するレコードをすべて取得する。

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.

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

nnテーブルを用いた新規ファイルの登録についての注意

viewによっては、nullでエラーを吐き出すので登録&nullの設定には、注意が必要

<%= %>と<% %>の違い

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

rails4からの:confirm廃止について

参照サイト:http://rails.takayukikoyama.com/rails4-1/link_to-confirm-abolition/

 廃止と言われても、確認もなしに削除してしまうのは困る。しかし、aタグをベタ書きしなければならないかというとそうではなく、ただ書き方を変えればいい。Rails4.1ではdata:オプションを使って以下のように書くと正常に動作する。

form_for で特定の要素しか入れない場合の書き方

<%= form_for @reset_password.password do |f| %>

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

form_forで入れたデータはどう見る?

paramsに配列として格納されているので、入力値で指定した:emailの様に、params[:email]と要素を指定してあげる

純粋なフォームのみのものからpostしてきたデータを確認したいとき

サーバーがログを吐いているのでそこを確認

imageを一覧表示

iamgetagを使う

「public」ディレクトリ直下に画像ファイルを設置した場合:

<%= image_tag '/flower.png' %>

--> Flower

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でモデルの指定をしないでフォームを作る

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が入った状態で送られる

form_tag('user/sign_in') do 
end

のような書き方もあり

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

#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で渡す際に引数としてフォームで利用している変数も渡す

<%= 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:resetrake db:migrate(※ただし、migrate:resetの場合は、再度、migrateする必要なし)

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

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の履歴をチェックしたいとき

rails c
ActiveRecord::Migrator.get_all_versions

そこから調べた特定のversionに戻したいときは

 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

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で作ったユーザーの種類が一つのとき

application_controller.rb
class ApplicationController < ActionController::Base

  private

  def after_sign_in_path_for(resource)
        homes_path
  end
end

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

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:

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

Now you can call it in the controller:

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)

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

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

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のバックアップを取りたいとき

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に記載

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.

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のファイルを直接指定してインストールするとできた

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

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

rails generate bootstrap:install static

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

部分的に挙動を確認したいとき

止めたいところにfailと書き込めばオッケー

Routing

routingを行う際にresousesの注意点

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

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にしてあげる

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

pathとurlの実行結果の違い

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という状態で

git push origin master

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

git push origin mac:master

この場合はローカルのmacブランチからリモートのmasterブランチへpush している様子

実は以下のような意味になります。
ローカルのhogeブランチをリモートのhogeブランチにpush!です。
コマンドに落としこんでみましょう。
git push {ローカルのhoge}:{リモートのhoge}
2ヶ所あった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の巻き戻し

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の2段階認証(電話を用いた)を行っていることが前提
https://support.google.com/accounts/answer/185833?hl=ja
このサイトから個別アプリのパスワードを生成して、config/environments/development.rb への設定を変更する(パスワード)

railsのアプリケーション上からはmailが送れないというエラー(コンソールからは送れる)

config/environments/development.rb
のmailer_deliverのエラー設定をtrueにすると解決

config.action_mailer.raise_delivery_errors = true

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

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

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

[内容はこんな感じ]

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

:data => {:confirm +++}

data: {:confirm +++}

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

基本的な注意点(ファイルとクラス名)

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

プロファイラの非表示

alt + p

雑記

controllerとmodelの書き分け

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

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

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

121
125
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
121
125