Я использую стандартные помощники HTML
<%= form_for @person do |f| %>
<%= f.label :first_name %>:
<%= f.text_field :first_name %><br />
<%end%>
Но допустим, я хочу деактивировать текстовое поле, если имя первого пользователя не редактируется текущим пользователем. Так что CanCan говорит, что я могу сделать это
<%= f.text_field :name if can? :update, @person, :first_name %>
Это хорошо, но я хотел бы абстрагировать это как-то так:
<%= f.conditional_text_field :first_name %>
В этом примере мой пользовательский помощник HTML знает, что я говорю о @person, потому что он в форме помощника через f.object. Мне это нравится, потому что переработанная обработка нередактируемых атрибутов может контролироваться централизованно. Я мог бы отображать отключенное поле ввода или отображать текст. Если ничего другого, у меня есть удобный крючок для обновления авторизации, если CanCan изменится, будет заменен чем-то в будущем, или я хочу подключиться к какой-нибудь сумасшедшей вещи рабочего процесса.
Это похоже на хорошую идею?
Уже есть драгоценный камень для этого?
Обновление
В настоящее время я смотрю на добавление помощника следующим образом:
def can_text_field(f, field, *args)
field = field.to_sym
if can? :update, f.object, field
return f.text_field field.to_sym *args
else
if can? :read, f.object, field
return f.object.send(field)
else
return "Not Authorized"
end
end
end