Простой вспомогательный метод - я делаю это правильно? - PullRequest
2 голосов
/ 08 октября 2010

Новое в Ruby и Rails.

Я разрабатываю простое приложение для регистрации команд, игроков и т. Д., И оно выглядит следующим образом:

Team 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"

Сначала он использовался только из обычного представления, но затем, когда я захотел использовать его из представления администратора, мне также пришлось добавить параметр со значением по умолчанию и дополнительным предложением if.

Есть ли лучший способ?

Ответы [ 4 ]

2 голосов
/ 08 октября 2010

Я бы вообще не использовал вспомогательный метод.Вспомогательные методы не должны использоваться для получения данных модели.Вот для чего эта модель.

Вы можете сделать что-то вроде этого:

обычные пользователи:

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

admin:

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

admin:

<% @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"; -)

0 голосов
/ 08 октября 2010

Похоже, вы можете просто сделать:

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 голосов
/ 08 октября 2010

Вы можете определенно рефакторинг этого!

def playerteam(player = nil)      
  player ||= @player
  return "No team" if player.team_id.nil?
  Team.find(player.team_id).name
end
0 голосов
/ 08 октября 2010
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...