2012-08-28 26 views
0

我正在致力於催化劑設計數據庫的前端。我是perl和催化劑的新手。我在控制器中遇到了一個錯誤。從催化劑控制器調用子程序

我想從一個表中獲取基因名稱,並將每個基因名稱傳遞給子程序gene_name(調用子程序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 -%] 

上述代碼是獲取哈希引用而不是頁面中的名稱。我無法在網頁上顯示基因名稱。如果我在for循環中給出[%g.symbol%],那麼頁面將是空的,沒有錯誤消息。希望這將是用於回答我的問題的足夠信息。如果沒有,我會詳細說明。

我的SQL查詢如下:提前

UPDATED2

Select Symbol from GeneTable; 

感謝正如我不是一個全職程序員,我問的博客這些問題。請幫我解決我的問題。如果萬一我有搜索表單從用戶獲取基因名稱,並且此基因名稱必須傳遞給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被用於()子程序。

+0

首先,使用關鍵字'列',而不是'列'。 https://metacpan.org/module/DBIx::Class::Manual::ookook#Using-specific-columns – Joel

+0

我自己並不使用DBIx :: Class,但在我看來,第一個散列參數用於搜索'應該有一些參數,當然?是不是該構造的目的是建立一個查詢相當於'SELECT * FROM gene WHERE symbol =?' – RET

+0

@ret對不起Ret我無法正確地向你傳達我的問題。請參閱更新後的問題 – user1462804

回答

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對象。

UPDATE以下OP的初始兩點評論

聽起來gene_name()(其可能應該被稱爲gene_aliases())是一個基因對象的方法。將這樣的轉換放到Controller中並不符合良好的MVC理念。

大概你有模型代碼的地方 - 我的應用程序/型號/基因/最有可能 - 和這個子應該存在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對象。

+0

感謝您的回覆。請讓我知道你的意思,同時說「控制器看起來沒有這個合適的地方」,因爲我不清楚還有什麼可以添加到控制器。讓我知道爲什麼會出現上述錯誤。當我運行下面的循環時,我可以訪問我的.tt文件中的基因名稱:[%FOREACH g IN gene_list-%] [%g.symbol%]
[%END%] – user1462804

+0

我不理解什麼正在發生。如果你能讓我知道如何着手,那將是非常好的。我沒有得到我應該在新子程序中添加的值來獲取值(基因名稱)。 – user1462804

+0

查看更新的答案。 – RET