5

Pido disculpas si esto no sigue las pautas de una buena pregunta, pero espero que esté bien en la clase con How to Manage CSS Explosion y reciba una respuesta similar.¿Cómo administro if-then explosión en archivos de vista?

estoy familiarizado con algunas de las estrategias básicas de mitigación vista prolijidad tales como los siguientes:

  • Use ayudantes en su caso
  • No te repitas
  • Use parciales y diseños

No dude en sugerir algo si me falta una gran idea en la lista anterior.

Sin embargo, sigo teniendo varias dimensiones/grados de libertad en mi opinión, lo que provoca un montón de declaraciones if-then o al menos ternarios. Por ejemplo, en algo que estoy actualmente jugar con, estoy trabajando en una barra de cabecera para un programa donde la vista se llama cuando tres "grandes" variables:

  • si el usuario es admin
  • si el usuario se registra en
  • si la página que se está viendo pertenece al usuario u otra persona

se termina pareciéndose a este lío:

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

Ugly. Legible y de fácil acceso, pero feo. ¿Algunas sugerencias?

Entre la experiencia y las nuevas tecnologías como LESS, me he vuelto bastante bueno para adelgazar mis archivos CSS, pero todavía estoy teniendo problemas de explosión con mis vistas MVC.

+0

Esto va a ser una de esas preguntas que nadie se sienta juego suficiente para responder, porque es una cuestión tan obstinada .. Am deseando escuchar lo que la gente viene sin embargo! – 2potatocakes

+0

Honestamente, deseo que haya una buena manera de "desarmar" esta pregunta. Si usted (y cualquier otra persona) tiene alguna buena idea, puede editar la pregunta. –

Respuesta

6

me gustaría utilizar ayudantes y las definiciones de modelos para secar su código:

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 

Luego, puede simplificar todas las sentencias if para el user_program_path llamadas a este:

<%= user_program_link @user %> 

lo que reduciría su ver código para:

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

Continuar este proceso para SECAR el resto del yo tu código también

+0

En el asistente de enlace, la condición 'if' debe ser' if user and user! = Current_user'. –

+1

No, la forma en que la tengo es correcta, porque cuando hay un usuario, se requiere una clase de 'activo' y el método posesivo se ocupa del formato correcto del texto. –

0

volver a escribir el código de la vista de la siguiente manera:

<% 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 %> 
Cuestiones relacionadas