Rails 4 с CanCan: неизвестная ошибка атрибута после включения load_and_authorize_resource

Я работаю в Rails 4 и заставил CanCan работать хорошо с инструкциями из этой проблемы, за исключением одного варианта использования, который, как мне кажется, может быть относительно распространенным.

У меня есть модель Comment, которая has_many :comments, through: :replies для вложенных комментариев. Все это работает хорошо, пока я не добавлю load_and_authorize_resource в свой контроллер комментариев. Проблема, похоже, связана со скрытым полем, отправляющим необязательный атрибут :parent_comment_id моему действию создания.

Я разрешил этот атрибут с помощью сильных параметров:

def comment_params
  params.require(:comment).permit(:content, :parent_comment_id, :post_id, :comment_id, :user_id)
end

Чтобы я мог создать ассоциацию, если включен :parent_comment_id:

if comment_params[:parent_comment_id] != nil
  Reply.create({:parent_comment_id => comment_params[:parent_comment_id], :comment_id => @comment.id})
end

Но как только я добавляю load_and_authorize_resource, я получаю ошибку неизвестного атрибута для :parent_comment_id. Что мне не хватает?


person Chris Fritz    schedule 21.06.2013    source источник


Ответы (1)


Решение пришло ко мне во сне. Вот что я сделал для решения проблемы:

Единственная причина, по которой comment_params обычно не возникало проблем при создании, заключалась в том, что я исключил дополнительный параметр :parent_comment_id, например:

@comment = post.comment.create(comment_params.except(:parent_comment_id))

Однако, когда CanCan использовал метод comment_params, он не проводил такой санитарной обработки. Отсюда и проблема. Было бы грязно добавлять эту санитарию в CanCan для каждого контроллера, поэтому я сделал то, что должен был сделать все это время, и вместо того, чтобы передавать :parent_comment_id внутри :comment, я использовал hidden_field_tag, чтобы передать его за пределы :comment и получить к нему доступ через простой, старый params.

Я надеюсь, что это поможет кому-то еще, кто делает подобную ошибку!

person Chris Fritz    schedule 22.06.2013