0

データベースのフロントエンドを設計するための触媒に取り組んでいます。私はperlと触媒が初めてです。コントローラーで 1 つのエラーが発生しました。

あるテーブルから遺伝子名を取得し、各遺伝子名を特定の機能を実行するサブルーチンgene_name(サブルーチンgene_nameを呼び出す)に渡したいと思います。遺伝子名で列を取得する方法はいくつかありますが、それらは他のテーブルへのハッシュ参照の形式です。私の遺伝子名への呼び出しが機能していません。

値を参照ではなくサブルーチンに渡す方法はありますか? 私のコードは次のとおりです。

my @gene_list = $c->model('Gene::GeneTable')->search({      
},{
                column =>[qw/symbol/],
}
);
foreach my $gene (@gene_list){
push @gene_aliases, &gene_name($gene);
}

コードを実行した後に発生するエラーは次のとおりです。

DBIx::Class::ResultSet::find(): Can't bind a reference (MyApp::Model::Gene::GeneTable=HASH(0x7ff6d88b7c58))

更新しました

私のgene_name()サブルーチンは、コントローラーに含めた別のモジュールにあります。for ループ (コントローラー内) を次のように変更しました。現在、遺伝子名を Gene_name() に渡してエイリアスをフェッチしています (ただし、クエリは同じままです)。

foreach my $gene (@gene_list){
push @gene_aliases, &gene_name($gene-> symbol);
}

次のように、ビュー ファイルで @gene_aliases にアクセスしています。

[% FOREACH g in gene_aliases -%]
[% g %]
[% END -%]

上記のコードは、ページ内の名前の代わりにハッシュ参照を取得しています。Web ページに遺伝子名を表示できません。for ループで [% g.symbol %] を指定すると、ページは空になり、エラー メッセージは表示されません。これが私の質問に答えるのに十分な情報であることを願っています。そうでない場合は、詳しく説明します。

私のSQLクエリは次のとおりです。

Select Symbol from GeneTable;

前もって感謝します

UPDATED2

私はフルタイムのプログラマーではないので、ブログでこれらの質問をしています。私の問題を解決するのを手伝ってください。ユーザーから遺伝子名を取得する検索フォームがあり、この遺伝子名をgene_name()サブルーチンに渡す必要がある場合、これをどのように渡すのですか(コントローラーとgene_name()を呼び出す方法)。この問題を解決するために私を助けてください。view.tt の私のフォームは次のとおりです。

<form method="post" action "[% c.uri_for('/gene')%]">
<input type="text" name="search_alias">
<input type="submit" name="alias_search" value="Search">
</form>

私のエイリアスはすべて、gene_name() サブルーチンで使用されている Alias という別のテーブルにあります。

4

1 に答える 1

1

gene_name()関数は、GeneTable オブジェクトが渡されることを期待する必要があるか、次のように呼び出しますgene_name($gene->symbol)

そうは言っても、提供した限られた情報に基づいて、コントローラーはこれに適した場所のようには見えません。

Gene_name をGene::GeneTableそれ自体のメソッドとして使用する方がはるかに理にかなっています。つまり、次のようになります。

package GeneTable;

...

sub gene_name {
    my $self = shift;
    my $gene_name = ... # do something with $self->symbol
    $gene_name
}

...

->gene_nameメソッドが任意のコンテキストの任意の GeneTable オブジェクトで使用できるようにします。

OPの最初の2つのコメントに続くUPDATE

(これgene_name()はおそらく と呼ばれるべきですgene_aliases()) は Gene オブジェクトのメソッドのようです。このような変換をコントローラーに入れることは、優れた MVC 哲学に準拠していません。

おそらく、どこかにモデルコードがあります - MyApp/Model/Gene/ の可能性が最も高く、このサブは 内に存在するはずGene/GeneTable.pmです。次に、次のように使用できます。

[%- FOREACH g IN gene_list -%]
    [% g.symbol %]<br/><ul>
    [%- FOREACH gn IN g.gene_name -%]
    <li>[% gn %]</li>
    [%- END -%]
    </ul>
[%- END -%]

テンプレート内、および GeneTable オブジェクトまたはそのコレクションがあるその他の場所。

更新#2 更新された質問に続く

DBIx:Classあなたと同じようにリストコンテキストで呼び出されると、オブジェクトの配列を返します。Data::Dumper->Dumper()おそらく、各ステップが何を返すかを把握するために、いくつかの呼び出しを追加する必要があります。

への呼び出しの直後に次の行を追加することをお勧めします->search()

$c->log->debug("gene_list contains: ", Data::Dumper->Dumper(\@gene_list));

...そして、入力した後の @gene_aliases の同等のデバッグ。

これにより、検索から得られるものをより明確に把握できるようになるかもしれませんが、Gene::GeneTableオブジェクトを取得していると推測するのは危険です.

于 2012-08-28T07:55:04.967 に答える