简单的帮助方法 - 我做得对吗?

时间:2010-10-08 09:43:33

标签: ruby-on-rails

Ruby和Rails的新手。

我正在开发一个简单的应用程序,您可以在其中注册团队,玩家等,它看起来像这样:

团队has_many玩家 球员属于球队

当我想在视图中显示播放器时(普通用户):

<%= @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

它有效,但它不漂亮或“Ruby Sexy”

起初它只是从普通视图中使用,但是当我想从admin-view中使用它时,我还必须添加带有默认值和额外if子句的参数。

有更好的方法吗?

4 个答案:

答案 0 :(得分:2)

我根本不会使用辅助方法。不应使用辅助方法来检索模型数据。这就是模型的用途。

你可以这样做:

普通用户:

<%= @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 - 帮助

执行类似的操作

要避免每个视图中的? : - 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 Sexy”; - )

答案 1 :(得分: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

在你的情况下似乎足够了。或者您可以在视图中设置(player || @player)

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

帮助最简单,因为你定义了玩家的所有时间

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

end

答案 2 :(得分: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

答案 3 :(得分:0)

你绝对可以重构它!

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