元祖若手のプログラミング奮闘記

元祖若手の奮闘記。主にメモ

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/...

こうしましょう