記述の順番は自分がぶつかって、調べた&解決した順番
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.bye
はBar
クラスに対する特異メソッド(=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.
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メソッドの引数部分
scope :name_like, ->(name) { where('name like ?', "%#{name}%") if name.present? }
この場合だと->(name)のname部分が引数になる
テーブルの自己結合(n:n)を実装する方法
テーブルでindexづけして重複を防ぐやり方
- indexづけ、最後は重複を防ぐためのもの
add_index :favorites, :favoriting_id
add_index :favorites, :favorited_id
add_index :favorites, [:favoriting_id, :favorited_id], unique: true
モデルのリレーションの書き方
フォロー関係を作成するモデル
belongs_to :follower, class_name: "User"
belongs_to :followed, class_name: "User"
元テーブルのモデル
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メソッドと異なる。
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に記載
scope :latest_member, -> (latest_number = 5) { order(created_at: :desc).limit(latest_number) }
ex.自分が所属しているコミュニティを上位5件
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を回避する方法
別途メソッドを作る(今回の対処)
こんな感じ。
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をスキップする書き方は、以下を参考
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_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を使いたい場合は、どうする?
ルーティングで
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
今回使ったのは、これ
指定した条件に合致するレコードをすべて取得する。
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.
<% @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' %>
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を扱う場合の注意点
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:reset
→rake 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
# 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で作ったユーザーの種類が一つのとき
class ApplicationController < ActionController::Base
private
def after_sign_in_path_for(resource)
homes_path
end
end
Deviseで作ったユーザーの種類が複数のとき
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:
scope :instanceprojects, lambda { |user|
where("projects.instance_id = ?", user.instance_id)
}
Now you can call it in the controller:
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のバックアップを取りたいとき
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.autoload_paths += Dir["#{config.root}/lib/tasks"] #バッチファイルを使うためのpathを通す
wheneverで定期的にバッチファイルを回す
手順:
- Gemfileにwheneverの追加
- whenever . のコマンド実行→これでconfig/schedule.rbができる
- schedule.rbの中に行いたい記述
ex.
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のファイルを直接指定してインストールするとできた
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とか。。。)
個別なものを設定したい場合は、以下のように
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にしてあげる
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
手順
- パスワード再設定ボタンを押す
- メールアドレス入力画面に移行
- 入力されたメールアドレスからユーザーを検索
- ヒットしたユーザのパスワード編集の状態を準備
- メールにパスワード再設定画面のURLを送付
- パスワードの編集を行う→アップデート
- 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
バッチファイルの作成方法
- 実行する内容を設定するファイルをlib配下に設置
- pathを通すため、config/application.rbのmodule内にpathを通す内容を記載
[内容はこんな感じ]
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