2010-11-03 3 views
1

У меня есть список книг, в которых отображаются кнопки редактирования и куча дополнительной информации, если пользователь, входящий в систему, является администратором. Прямо сейчас у меня есть два отдельных частичных файла, которые отображаются в зависимости от того, какой тип пользователя зарегистрирован. У меня было только одно частичное с кучей if user.admin? но он начал становиться настоящим уродливым. Теперь я жонглирую вокруг двух файлов, с небольшим количеством дубликатов данных в каждом. Есть ли лучший способ сделать это?Помогите мне реорганизовать мои взгляды пользователей-пользователей против неадресовки пользователей.

index.html.erb

<ul> 
    <% if @current_user.admin? %> 
    <%= render :partial => "book", :collection => @books %> 
    <% else %> 
    <%= render :partial => "non_admin_book", :collection => @books %> 
    <% end %> 
</ul> 

_book.html.erb

Title: <%= book.title %> EDIT BUTTON 
<!-- Awesome extra info for admins --> 
Author: <%= book.author %> 
<!-- Awesome extra info for admins --> 

_non_adminbook.html.erb

Title: <%= book.title %> 
Author: <%= book.author %> 

ответ

3

Этот вопрос, как: я должен использовать только I18n ключи на всем частичном/просмотре или я должен использовать X-представления/частичные для каждого языка?

Нет хорошего или плохих решений. Мое мнение состоит в том, что вы должны начать с использования условных чисел, таких как <%, если admin? %> blah blah <% end%> ...

Затем, если ваш административный просмотр великолепно отличается от ваших не-админ-просмотров, удалите условные обозначения и создайте два вида: my_view/my_view_admin.

2

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

В вашем случае, я могу сказать, что

  • администратор имеет возможность редактировать поля (встроенный?)
  • администратор видит больше полей

Обычно я использую on_the_spot камень для встроенного редактирования, а затем я работаю со вспомогательным помощником:

def on_the_spot_edit_if_allowed(object, field, options) 
    if current_user.admin? 
    on_the_spot_edit object, field, options 
    else 
    object.send(field) 
    end 
end 

И в этом случае мое мнение становится чем-то вроде

Title: <%= on_the_spot_edit_if_allowed book, title %> 
<%- if current_user.admin? %> 
    <!-- Awesome extra info for admins --> 
<% end %> 
Author: <%= book.author %> 
<%- if current_user.admin? %> 
    <!-- Awesome extra info for admins --> 
<% end %> 

Если это не иначе (ограничения/дизайна пользовательских интерфейса) невозможно, я бы реорганизовать эту точку зрения на следующее:

Title: <%= on_the_spot_edit_if_allowed book, title %> 
Author: <%= book.author %> 
<%- if current_user.admin? %> 
    <%= render :partial => 'extra_admin_fields' 
<% end %> 

Надеется, что это помогает.

1

Храните его как есть.

Ваши дублирования не такие большие.

Условие @current_user.admin? будет работать только один раз с вашим решением.

Если вы положили @current_user.admin? в общей частичной форме, он будет баллотироваться на каждый член этой коллекции. Не круто.

Смежные вопросы