PHPの配列(array_diff)を甘くみていたらはまった
これは特殊なケースかなと思ったけど一応メモ。
PHPの配列を深く知らなかったがために
結構はまった。。
追加した処理が二つの配列を比較して
新たにデータを追加したり、削除するような機能を作りたいとする。
<?php $array1 = array("green", "red", "blue", "red"); $array2 = array("green", "yellow", "red"); $result = array_diff($array1, $array2); print_r($result); ?>
こちらの$resut変数をそのまま引数として渡すとこうなる
Array ( [1] => blue )
ここの添え字が [1] になっているのが
わかると思うが
添え字もしっかり [0] にして渡さないと
エラーになってしまうことがつい最近わかった
ってことで初期化
<?php $array1 = array("green", "red", "blue", "red"); $array2 = array("green", "yellow", "red"); $result = array_diff($array1, $array2); print_r(array_merge($result)); ?>
Array ( [0] => blue )
これでオッケー
もう値はあってるのになんで。。。
みたいなことはなくなるかと
Raisでコードの書き方で指摘されたこと
Railsで指摘されたことをまとめる
・アロー演算子を使わない
# 古いコードを見ながら書くとついついやるやつ validates :name, :presence => true # こっちの書き方で validates :email, presence: true
・evalを使わない
セキュリティ上よくないらしいけど
深くまで知らない
あと例が悪くて申し訳ない。。
_params = set_params search_types = [] if _params[:name].present? name_ids = User.get_ids_by_name(_params[:name]) search_types << "name_ids" end if _params[:email].present? email_ids = User.get_ids_by_email(_params[:email]) search_types << "email_ids" end # &にすることで二つの配列で同じ値のみ代入される # merge_ids = name_ids & email_ids merge_ids = eval(search_types.join("&"))
・長い1行を改行するときのインデント
メモ残すまでって感じではないけど一応。。
# こうするとselfを変えた際に # いちいちインデントをそろえなくちゃいけない self.where(name: my_name) .where(email: my_email) .first # これで self.where(name: my_name) .where(email: my_email) .first
まだまだ言われてるけど
まずはこれくらいで
PHP var_dump 全出し(メモ)
よく見かける記事ですがメモ代わりで
var_dumpって長文省略されんちゃうんだねって
ことで省略されないようにする
<?php #前略 $string = "・・ めっちゃ長文 ・・"; ini_set('xdebug.var_display_max_children', -1); ini_set('xdebug.var_display_max_data', -1); ini_set('xdebug.var_display_max_depth', -1); var_dump($string); #後略 ?>
コントローラー、ヘルパー、ビューにモデル処理を描くんじゃない!
タイトルの通り今回これをやらかしてたので
今日はこれ
当たり前っちゃ当たり前なんだけど
コード書きまくってたら良くやるのもこれ
なんてったって実際そんな書き方してるコードが
あるんだから参考にしちゃうよねw
基本書くのはこちら
app/models/...
気を付けよう!
まず一例でこちら
ヘルパーにモデル処理書いてみたよ。
app/helpers/users_helper.rb
module UsersHelper def get_user_names_by_group(group) User.where(group: group).pluck(:name) end end
これは突っ込みありまくりコードだけど
気を付けよう実際あったし。
app/controllers/users_controller.rb
def create if request.post? @users = set_user_params User.transaction do @users.each do |user| new_user = User.new(name: user[:name]) raise unless user.save end end end @users = User.all end
まぁどんまい!
コードの書き方(命名編)
良くセンスがないと言われ続ける
関数や変数の命名。。
指摘されたことを忘れないよう
メモがわりで。。。
(あくまで一例としてご覧ください!)
・private関数は先頭に _ をつける
※2017/07/17追記
これ _ つけなくていいって言われた。。
俺全部直したええ。。
private def set_param ... end
モデルの関数名は
select_user
よりも
get_user
条件をつけるときは
後ろにbyをつける
app/models/user.rb
def get_user_by_name(name) self.where(name: name).first end
app/assets配下には
複数ファイルがあるなら
ひとつディレクトリを作る
app/assets/javascript/user_editor.js
app/assets/javascript/user_window.js
こういうのね
app/assets/javascript/user/...
こうしましょう