2010-10-08 45 views
2

Ruby和Rails的新手。簡單的輔助方法 - 我做對了嗎?

我開發,你可以註冊球隊,球員等簡單的應用程序,它看起來像這樣:

隊的has_many玩家 玩家belongs_to的團隊

當我要顯示在畫面中玩家(普通用戶):

<%= @player.name %> - <%= playerteam %> 

,並在管理視圖,它看起來像這樣:

<% @players.each do |player| %> 
    <tr>   
     <td><%= player.id %></td> 
     <td><%= player.name %></td> 
     <td><%= playerteam(player) %></td> 
     <td><%= owner(player) %></td>    
    </tr> 
<% end %> 

和輔助方法:

def playerteam(player = nil)  
    if player != nil 
    if player.team_id == nil 
     return "No team" 
    else 
     @team = Team.find(player.team_id) 
     return @team.name 
    end 
    else    
    if @player.team_id == nil 
     return "No team"  
    else 
     @team = Team.find(@player.team_id) 
     return @team.name 
    end 
    end 
end 

它的工作原理,但它不是漂亮或「紅寶石性感」

起初,人們只能從普通視圖中使用,但後來當我想用它admin-view也是我必須添加一個默認值和額外的if子句的參數。

有沒有更好的方法?

回答

2

我根本不使用輔助方法。 Helper方法不應該用於檢索模型數據。這就是模型的用途。

你可以做這樣的事情:

普通用戶:

<%= @player.name %> - <%= player.team ? player.team.name : 'No Team' %> 

管理:

<% @players.each do |player| %> 
    <tr>   
     <td><%= player.id %></td> 
     <td><%= player.name %></td> 
     <td><%= player.team ? player.team.name : 'No Team' %></td> 
     <td><%= owner(player) %></td>    
    </tr> 
<% end %> 

你也許可以做到與owner -helper

到類似的東西避免使用? : -if-else語法在每一個視圖中,您可以添加到您的播放器模型

class Player < ActiveRecord::Base 
    def team_name 
    team ? team.name : "No Team" 
    end 
end 

那麼你的觀點是這樣的:

普通用戶:

<%= @player.name %> - <%= @player.team_name %> 

管理:

<% @players.each do |player| %> 
    <tr>   
     <td><%= player.id %></td> 
     <td><%= player.name %></td> 
     <td><%= player.team_name %></td> 
     <td><%= owner(player) %></td>    
    </tr> 
<% end %> 

恕我直言:這會更「Rails性感」;-)

+0

是的,這就像一個魅力,非常性感。 :)我唯一需要改變的地方是<%= player.team_name%>到<%= @ player.team_name%>現在我必須對我的其他幫助器方法也這樣做。 – 2010-10-08 10:49:50

+0

很高興,我可以,並且我更正了我的代碼。 – jigfox 2010-10-11 07:53:53

0
def playerteam(player = nil)  

    if (player || @player).team_id == nil 
     return "No team" 
    else 
     @team = Team.find((player || @player).team_id) 
     return @team.name 
    end 

end 

似乎已經足夠你的情況。或者,您可以在您的視圖

<% @players.each do |player| %> 
    <tr>   
     <td><%= player.id %></td> 
     <td><%= player.name %></td> 
     <td><%= playerteam((player || @player)) %></td> 
     <td><%= owner(player) %></td>    
    </tr> 
<% end %> 

與助手簡單作出(player || @player),因爲你定義一個球員

def playerteam(player)  
    if player.team_id == nil 
     return "No team" 
    else 
     @team = Team.find(player.team_id) 
     return @team.name 
    end 

end 
0

看起來你可以做所有的時間:

def playerteam(player = @player) 
    if player.team_id == nil 
    return "No team" 
    else 
    @team = Team.find(player.team_id) 
    return @team.name 
    end 
end 

但你可能還想整理一下你的代碼:

def playerteam(player = @player) 
    if player.team 
    return player.team.name 
    else 
    return "No team" 
    end 
end 

如果你確實想把@team設置給玩家團隊,那麼我會在輔助方法以外的地方做它,因爲在輔助方法中設置屬性是非常令人困惑的。然後,您依靠已調用的助手方法訪問@team

0

你絕對可以重構它!

def playerteam(player = nil)  
    player ||= @player 
    return "No team" if player.team_id.nil? 
    Team.find(player.team_id).name 
end