2010-10-08 15 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