Помогите мне реорганизовать мои взгляды пользователей с правами администратора и пользователей без прав администратора - PullRequest
1 голос
/ 04 ноября 2010

У меня есть список книг с кнопками редактирования и кучей дополнительной информации, если пользователь, вошедший в систему, является администратором.Прямо сейчас у меня есть две отдельные партиалы, которые отображаются в зависимости от того, какой тип пользователя вошел в систему. Раньше у меня был только один партиал с кучей 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 %>   

Ответы [ 4 ]

3 голосов
/ 04 ноября 2010

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

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

Затем, если ваше представление администратора сильно отличается от вашего представления не администратора, удалите условные выражения и создайте два представления: my_view / my_view_admin.

2 голосов
/ 05 декабря 2011

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

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

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

Обычно я использую драгоценный камень 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 %>

Надеюсь, это поможет.

2 голосов
/ 03 декабря 2011

# 192 Авторизация с CanCan этот камень канкан может помочь вам

1 голос
/ 06 декабря 2011

Держите это как есть.

Ваши дубликаты не такие большие.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...