2013-03-30 2 views
1

В нашем приложении rails 3.2.12 мы хотели бы выборочно отображать поля в виде new/edit (используя simple_form) на основе правил доступа. Например, для продаж могут отображаться только name и phone# клиента. Поскольку мы не знаем, каким будет правило доступа, нам нужно динамически строить представление во время выполнения. Один из способов добиться этого - использовать if во взглядах, и это сделает просмотр грязным. Мы подумали, что может помочь форма построения custom. После прочтения нескольких сообщений в Интернете о создании пользовательских форм мы все еще не знали. Может ли кто-нибудь предоставить подробную информацию о том, как реализовать это с помощьюform builder? Спасибо за помощь!Как выборочно отображать поля в новых/редактируемых представлениях с помощью построителя настраиваемых форм в рельсах 3.2.12?

ОБНОВЛЕНИЕ: Поскольку мы не знаем, какое правило доступа должно быть, нам нужно построить dynamically конструкцию view во время выполнения.

ответ

2

Обычно настраиваемый форм-бланк используется для изменения структуры HTML-кода формы, а не для управления доступом к полям.

Несколько предложений «очистить» взгляды:

  1. Использование SimpleForm позволит вам обрабатывать поля формы/метки как единое целое, что делает его легче исключить поле, используя только что-то вроде = form_builder.input :credit_card_number if current_user.admin?.
  2. Для получения более широкого применения в масштабе всего приложения CanCan вы можете управлять авторизацией и ролями.

Edit:

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

= simple_form_for @model do |f| 
    = f.error_notification 
    - @model.columns_available_for(current_user).each do |column| 
     = f.input column 
+0

Забыл упомянуть, что мы используем simple_form. Мы создали собственный модуль аутентификации. Как мы поняли, CanCan не выполняет аутентификацию на уровне столбцов. – user938363

+0

Я вижу. Вы можете сделать CanCan своего рода аутентификацию на уровне столбца с пользовательскими действиями (https://github.com/ryanb/cancan/wiki/Custom-Actions), но похоже, что это не улучшит ситуацию в вашем случае. Поскольку вы уже используете SimpleForm, вы можете подумать о добавлении метода 'доступный_columns_for_role' к вашей модели (возвращающего массив символов), а затем просто запустите цикл представления, вызвав' simple_form_builder.input' для каждого из них. –

+0

И на самом деле attr_accessible уже поддерживает параметр «: as =>: role», поэтому вы можете найти способ прочитать эти параметры в цикле представления. –

1

вы можете использовать рельсы помощников, чтобы сделать это.

Для примера.

module SalesHelper 
def show_fields 
    if current_user.admin? 
    render 'some_partial' #having name and phone field 
    else 
    render 'other_partial' 
    end 
end 

конец

В ваших взглядах добавить соответствующие парциальные и из новых или редактирования просто позвоните
<% = show_fields%>

+0

Интересно! Помощник будет делать вид чище. – user938363

+0

Поскольку мы не знаем, каким будет правило доступа, существует ли способ динамически построить представление во время выполнения? – user938363