検索フォームの作り方。

<form class="form-horizontal" method="post">
  <div class="form-group">
    <label for="number" class="control-label col-xs-4">年月</label>
    <div class="col-xs-3">
      <select class="form-control" id="number" name="yyyymm">
        <option value="">選択してください</option>
        <option value="201805">201805</option>
        <option value="201806">201806</option>
        <option value="201807">201807</option>
        <option value="201808">201808</option>
        <option value="201809">201809</option>
        <option value="201806">201810</option>
        <option value="201811">201811</option>
        <option value="201812">201812</option>
      </select>
    </div>
  </div>



<form class="form-horizontal" method="post">
  <div class="form-group">
    <label for="number" class="control-label col-xs-4">部署</label>
    <div class="col-xs-3">
      <select class="form-control" id="number" name="department">
        <option value="">選択してください</option>
        <option value="xxxx部">xxxx部</option>
        <option value="yyyy部">yyyy部</option>
        <option value="zzzz部">zzzz部</option>
        <option value="hoge部">hoge部</option>
        <option value="fuga部">fuga部</option>
        <option value="aaaa部">aaaa部</option>
      </select>
    </div>
  </div>

  <div class="form-group">
    <label for="name" class="control-label col-xs-4">名前</label>
    <div class="col-xs-3">
      <input type="text" class="form-control" id="name" name="name" placeholder="名前を入力してください">
    </div>
  </div>
    <div class="form-group">
    <div class="col-xs-offset-2 col-xs-7">
      <button type="submit" name="submit" class="btn btn-block">検索</button>
    </div>
  </div>
</form>

こんな感じ。
f:id:wanwan_bowbow_ilovecat:20180615213406p:plain

エントリを使う処理の書き方

sub capture_entry :Chained('/') :PathPart('') :CaptureArgs(1) {
    my ( $self, $c, $entry_id ) = @_;
    if (my $entry = $c->model('DB::Hoge')->find($entry_id)) {
        $c->stash->{entry} = $entry;
    } else {
        $c->stash->{template} = 'not_found.tt';
    }
}


sub jump_entry :Chained('capture_entry') :PathPart('jump') :Args(0) {
    my ( $self, $c ) = @_;
    my $entry = $c->stash->{entry};
# counterを1増やして更新
    $entry->counter($entry->counter + 1);
    $entry->update;
    $c->res->redirect($entry->url);

Bootstrap

Bootstrapを使うときのおまじない。

<!doctype html>
<html lang="ja">
    <head>
        <meta charset="utf-8">
        
        <!-- viewport meta -->
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

        <!-- Bootstrap CSS -->
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">

    </head>
    <body>
        <h1>Hello, Bootstrap 4!</h1>
        
        <!-- jQuery、Popper.js、Bootstrap JS -->
        <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
        <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
    </body>
</html>

2018/06/11

Caught exception in Hoge::Controller::Root->signup "Can't open '' for input:
ãã®ã‚ˆã†ãªãƒ•ã‚¡ã‚¤ãƒ«ã‚„ディレクトリã¯ã‚ã‚Šã¾ã›ã‚“ at /usr/local/lib64/perl5/YAML/XS.pm line 46."

上記エラーの原因が判明。

__PACKAGE__->config(
    "Plugin::ConfigLoader" => {
        file   => __PACKAGE__->path_to(qw(etc hoge.conf)),
        driver => { "General" => { -ApacheCompatible => 1, -UTF8 => 1 } }
    },
    name => "Hoge",
    disable_component_resolution_regex_fallback => 1,
);

lib/Hogr.pmに上記コードを入力したところ解決。
エラー文を元に論理的に考えた結果、上記コードを入力すれば解決すると導き出せないところがプログラマーとしてまだまだ未熟だと感じた。

2018-06-08

Can't locate Catalyst/Plugin/FormValidator/Simple.pm in @INC (@INC contains: /home/xxx/xxxxxx/script/../lib /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/local/share/perl5/Catalyst/ScriptRole.pm line 90.
Compilation failed in require at /usr/local/share/perl5/Catalyst/Utils.pm line 309.

上記のようなエラーが出る時って、大抵モジュールがインストールされていないだけ。

Caught exception in Hoge::Controller::Root->signup "Can't open '' for input:
ãã®ã‚ˆã†ãªãƒ•ã‚¡ã‚¤ãƒ«ã‚„ディレクトリã¯ã‚ã‚Šã¾ã›ã‚“ at /usr/local/lib64/perl5/YAML/XS.pm line 46."

原因不明のエラーが発生中。
XS.pm内でファイルの呼び出しが失敗しているので、yamlディレクトリ内のファイルに問題がありそう。

検索機能を実装する際のコードの書き方について

検索機能を実装した当初、年月・部署・名前を全て指定しないと正常に検索結果が表示されなかった。
いずれかの項目が入力されなかった場合でも、条件一致するテーブルを表示させるために下記のようなコードを書いた。

sub kikaito :Local {
    my ( $self, $c ) = @_;
    $c->stash->{kikais} = [$c->model("DB::Kikai")->all];
    my $params = $c->req->params;
  
    if ( !($params->{yyyymm}) && $params->{department} && !($params->{name})){
        $c->stash->{kikais} = [$c->model("DB::Kikai")->search({ department => $params->{department}})];
    } elsif (!($params->{yyyymm}) && $params->{department} && ($params->{name    })) {
        $c->stash->{kikais} = [$c->model("DB::Kikai")->search({ department     => $params->{department}, name => $params->{name}})];
    } elsif (!($params->{yyyymm}) && !($params->{department}) && ($params->{name})) {
        $c->stash->{kikais} = [$c->model("DB::Kikai")->search({ name => $params->{name}})];
    } elsif ( $params->{yyyymm} && !($params->{department}) && $params->{name}) {
        $c->stash->{kikais} = [$c->model("DB::Kikai")->search({ yyyymm         => $params->{yyyymm}, name => $params->{name}})];
    } elsif ( $params->{yyyymm} && $params->{department} && !($params->{name})) {
    $c->stash->{kikais} = [$c->model("DB::Kikai")->search({ yyyymm             => $params->{yyyymm}, department => $params->{department}})];
} elsif ( $params->{yyyymm} && !($params->{department}) && !($params->{name})) {
        $c->stash->{kikais} = [$c->model("DB::Kikai")->search({ yyyymm => $params->{yyyymm}})];
    }
}

とても見辛い、、
絶対もっと良い書き方があるよねと同期と話してた。