2

Являясь новым для рельсов, я хотел получить советы от сообщества о том, как настраивать запретные зоны. Я только начал использовать Devise и прочитал о нескольких разных методах для перенаправления/рендеринга представлений на основе того, был ли пользователь зарегистрирован или нет, и мне интересно, как лучше всего это сделать.Каковы наилучшие практики при проектировании запретных зон в рельсах?

В настоящее время, когда я хочу, чтобы вошедший в систему пользователь имел другое представление о странице, а затем не зарегистрированный пользователь, я обрабатывал его в контроллере. Например:

class CollectionsController < ApplicationController 
    before_filter :authenticate_user!, except: [:index, :show] 

    def index 
    @collections = Collection.all 

    if current_user 
     render :admin 
    else 
     render :index 
    end 
    end 
end 

В этом случае :admin и :index соответствуют views/collections/admin.html.haml и views/collections/index.html.haml соответственно. Административный вид похож на макет на индексный, но имеет ссылки на редактирование, обновление, создание и т. Д.

Это лучший способ обойти это?

РЕДАКТИРОВАТЬ: Я также рассматривал возможность использования самозащиты, как CanCan, но не был уверен, что это будет излишним.

ответ

0

Я предлагаю вам проверить CanCan, если вы хотите, чтобы ваш код был хорошим и сухим - так, как вы сейчас это делаете, это приведет к большому количеству повторяющихся кодов и может стать неуправляемым. После установки CanCan создаст файл «Способность», в котором вы можете определить, что пользователи могут или не могут сделать. в вас случае, например, вы можете иметь

def initialize(user) 
    user ||= User.new # guest user (not logged in) 
    if user.admin? 
     can :manage, :all 
    else 
     can :read, :all 
    end 
    end 

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

<% if can? :create, Project %> 
    <%= link_to "New Project", new_project_path %> 
<% end %> 

Это супер полезный камень и очень хорошо документирован!

+0

Я решил пойти с CanCan, и это здорово! Действительно легко реализовать и использовать. –

+0

Мой единственный вопрос об этом методе, так как это кошерный, чтобы иметь такую ​​логику в представлении, если вы пытаетесь как можно скорее MVC? –

0

Вместо того, чтобы дублировать код просмотра для администраторов и гостевых пользователей и поддерживать их отдельно, вы можете просто иметь один вид index.html.haml и отображать ссылки для редактирования, обновления и создания и т. Д., Только если current_user не является нулевым или, если на то пошло, администратором.

На ваш взгляд:

- if current_user 
    = link_to 'Edit', edit_path 
    = link_to 'Update', update_path 

и в вашем CollectionController

def index 
    @collections = Collection.all 
end 

Таким образом, вам не нужно поддерживать двух различных видов, и вы можете избавиться от admin.html.haml.

Да, если у вас есть много разных мест, где вам нужно реализовать эти виды логики, то реализация CanCan gem, предложенная @Anchor, вероятно, будет способом.