Как запретить пользователю обновлять определенные поля с помощью CanCanCan?

Итак, если у меня есть пользователь, и он может создать/обновить свою службу, но не может: опубликовать (bool) их, что было бы лучшим решением, чтобы пропустить это поле из хэша update_params?

Я нашел это аналогичный вопрос, но он ссылается на CanCan 2.0, который так и не был выпущен, и мне было интересно, есть ли способ решить эту проблему с помощью CanCanCan, но я ничего не нашел в их документации. Большое спасибо!


person The Whiz of Oz    schedule 10.02.2015    source источник


Ответы (1)


Насколько я знаю, вы не можете. У меня было бы отдельное действие публикации. Поэтому я бы полностью исключил публикацию из формы и service_params.

Тогда я бы сделал что-то вроде этого:

Class ServicesController

  def publish
    @service = Service.find(params[:id])  
    @service.update_column(:publish, true)
  end

end

Тогда в способности

can :manage, Service
cannot :publish, Service

В качестве альтернативы вы можете сделать это (при условии, что у вас есть текущий пользователь и что-то, определяющее их как администратора)

def service_params
  if current_user.admin?
    params.require(:service).permit(:my_field, :publish)
  else
    params.require(:service).permit(:my_field)
  end
end

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

person j-dexx    schedule 10.02.2015
comment
при выполнении простой задачи, такой как обновление службы, для этого потребуются две формы или даже две разные страницы. Что делать, если я хочу использовать одну форму? - person The Whiz of Oz; 10.02.2015
comment
Нет, вам просто нужен оператор if вокруг полей. например if current_user.admin? - person j-dexx; 10.02.2015