2016-01-28 2 views
0

Предположим, у меня простая форма в шаблоне edit.slim. Как и следующиеКак сделать отдельную форму для модератора?

= simple_form_for article, method: :put do |f| 
    = f.input :title 
    = f.input :body 
    = f.button :submit 

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

Модератор должен иметь поле еще один inpur = f.input :status, as: :select

+0

Что имеет форму модератора в дополнение к обычной форме? –

ответ

2

Вы можете просто проверить роль (извините за Эрба вместо Слим):

<% if current_user.is_moderator? %> 
    <%= simple_form_for ... %> 
    <!-- moderator form content --> 
<% else %> 
    <%= simple_form_for ... %> 
    <!-- common form content --> 
<% end %> 

или если общие пользователи и модераторы могут использовать ту же форму:

<%= simple_form_for ... %> 
    <!-- common form content --> 
    <% if current_user.is_moderator? %> 
     <!-- moderator form content --> 
    <% end %> 
<% end %> 

Если форма модератора содержит необходимые поля, используйте первый вариант или добавить f.hidden_field:

<% if current_user.is_moderator? %> 
    <%= f.input :status, as: :select %> 
<% else %> 
    <%= f.hidden_field :status, value: some_default_value %> 
<% end %> 

Update: Не забудьте проверить права модератора в бэкэндом как Rich Peck советует

+0

Последний вариант, кажется, подходит для моего дела. Я попробую это. –

1

Если у вас есть модель пользователей, создать столбец для администратора и установить по умолчанию ложно. Тогда вы можете контролировать, какие части формы отображаются для

@user vs @user.admin 

или вы можете указать, что только @ user.admin может утвердить изображения или только @ user.admin может удалять темы или только @ user.admin могут голосовать вверх/вниз и т.д.

+0

Но как вы точно контролируете, какие части формы отображаются для другой роли? –

+0

Использование <% if %><% else %><% end %>. С точки зрения безопасности вы должны создавать фактические правила, которые запрещают немодераторам редактировать/размещать эти поля. в противном случае, например, что, если вы однажды допустите ошибку в своих представлениях и отобразите формы, теперь они могут делать то, что вы не хотите, чтобы они делали. – Shaomai888

2

Наиболее эффективным способом является чтобы использовать следующее:

= simple_form_for article, method: :put do |f| 
    = f.input :title 
    = f.input :body 
    - if current_user.moderator? 
    = f.input :moderator_input 
    = f.button :submit 

Это необходимо будет скопировать в co ntroller с соответствующей проверкой:

#app/controllers/articles_controller.rb 
class ArticlesController < ApplicationController 
    def create 
    params = current_user.moderator? ? "moderator_params" : "user_params" 
    @article = Article.new eval(params) 
    end 

    private 

    def user_params 
    params.require(:article).permit(:x, :y) 
    end 

    def moderator_params 
    params.require(:article).permit(:x, :y, :z) 
    end 
end