Как мне управлять if-then взрывом при просмотре файлов? - PullRequest
5 голосов
/ 17 февраля 2011

Я прошу прощения, если это не следует хорошим правилам для вопросов, но я надеюсь, что это хорошо в классе с Как управлять CSS Explosion и получает такой же полезный ответ.

Язнакомы с некоторыми базовыми стратегиями по уменьшению распространенности вида, такими как:

  • При необходимости используйте помощников
  • Не повторяйте себя
  • Используйте частичные и макеты

Не стесняйтесь предлагать что-то, если я упускаю какую-то большую идею в приведенном выше списке.

Тем не менее, у меня все еще остается несколько измерений / степеней свободы, что вызываетмного операторов if-then или хотя бы троичных блоков.Например, в чем-то, с чем я в настоящее время связываюсь, я работаю над строкой заголовка для программы, где представление вызывается, когда три «большие» переменные:

  • Является ли пользователь администратором
  • Независимо от того, вошел ли пользователь в систему
  • Является ли просматриваемая страница принадлежащей пользователю или кому-то еще

В конечном итоге это выглядит как этот беспорядок:

<% content_for :subheader do %>
  <div class="row">
    <% if @user %>
      <% if @user == current_user %>
        <%= link_to 'My programs', user_programs_path(current_user), :class => 'active' %>
      <% else %>
        <%= link_to "#{@user.username}'s programs", user_programs_path(@user), :class => 'active' %>
      <% end %>
      <%= link_to 'Browse all programs', programs_path %>
    <% else %>
      <% if current_user %>
        <%= link_to 'My programs', user_programs_path(current_user) %>
      <% end %>
      <%= link_to 'Browse all programs', programs_path, :class => 'active' %>
    <% end %>
    <%= link_to 'New Program', new_program_path, :class => 'admin' if current_user.admin? %>
  </div>
  <% if @regions %>
    <div class="row second">
      <%= link_to 'Regional program search', request.fullpath, :class => 'active' %>
    </div>
  <% end %>
<% end %>

Гадкий.Читаемый и легко доступный, но безобразный.Некоторые предложения?

Между опытом и новыми технологиями, такими как МЕНЬШЕ , я довольно хорошо похудел в своих CSS-файлах, но я все еще сталкиваюсь с проблемами взрыва с моими представлениями MVC.

Ответы [ 2 ]

6 голосов
/ 17 февраля 2011

Я бы использовал хелперы и определения моделей, чтобы высушить ваш код:

class User
  def possesive
    self == current_user ? 'My' : "#{username}'s"
  end
end

module ...Helper
  def user_program_link user
    if user
      link_to "#{user.possesive} programs", user_programs_path(user), :class => 'active'
    elsif current_user
      link_to 'My programs', user_programs_path(current_user)
    end
  end
end

Затем вы можете упростить все операторы if для вызовов user_program_path:уменьшит ваш код представления до:

<% content_for :subheader do %>
  <div class="row">
    <%= user_program_link @user %>
    <% if @user %>
      <%= link_to 'Browse all programs', programs_path %>
    <% else %>
      <%= link_to 'Browse all programs', programs_path, :class => 'active' %>
    <% end %>
    <%= link_to 'New Program', new_program_path, :class => 'admin' if current_user.admin? %>
  </div>
  <% if @regions %>
    <div class="row second">
      <%= link_to 'Regional program search', request.fullpath, :class => 'active' %>
    </div>
  <% end %>
<% end %>

Продолжите этот процесс, чтобы высушить и остальную часть вашего кода.

0 голосов
/ 17 февраля 2011

Перепишите код вида следующим образом:

<% content_for :subheader do %>
  <div class="row">
    <% if @user ||  current_user %>      
      <%= link_to ((current_user == @user or @user.nil?) ? "My programs" : 
                    "#{@user.username}'s programs"), 
                  user_programs_path(@user || current_user), 
                  :class => 'active' %>
    <% end %>
    <%= link_to 'Browse all programs', programs_path, 
          :class => (@user ? '' : 'active') %>
    <%= link_to 'New Program', new_program_path, :class => 'admin' if current_user.admin? %>
  </div>
  <% if @regions %>
    <div class="row second">
      <%= link_to 'Regional program search', request.fullpath, :class => 'active' %>
    </div>
  <% end %>
<% end %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...