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子句的参数。
有更好的方法吗?
答案 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