2016-02-23 5 views
1

Я использую CarrierWave и, чтобы иметь возможность удалить изображение, мне нужно разрешить параметр, который не является частью пользователя:Рельсы, сильные параметры, частично требуется

params.require(:user).permit(:first_name, :last_name, :description, :picture, :remove_picture) 

Это дает мне ошибки, но изменить его:

params.permit(:first_name, :last_name, :description, :picture, :remove_picture) 

как предложено в одном из тематических разделов на форуме, дает ошибку тоже - «Самовольная параметры фиксации, идентификатор» и т.д. Как я могу требовать пользователей и в то же время - разрешение remove_picture?

ответ

2

Вы должны гнездятся атрибут remove_picture под пользователем, как в примере, в readme:

<%= form_for @user, html: { multipart: true } do |f| %> 
    <p> 
    <label>My Avatar</label> 
    <%= image_tag(@user.avatar_url) if @user.avatar? %> 
    <%= f.file_field :avatar %> 
    </p> 

    <p> 
    <label> 
     <%= f.check_box :remove_avatar %> 
     Remove avatar 
    </label> 
    </p> 
<% end %> 

Это позволит вам сделать

params.require(:user) 
     .permit(:first_name, :last_name, :description, :picture, :remove_picture) 

защита массового назначения Рельсы в основном только хеш-нарезка:

  • .require достает один ключ из хэша a nd вызывает ошибку, если ее нет.
  • .permit возвращает ключи, которые разрешены, и маркирует хэш как безопасный для массового назначения.

Его предназначено для обработки хэша, вложенного под одним ключом param или в корень. Хотя вы можете сходить с ума, слияние двух хешей:

p = params.require(:user) 
      .permit(:first_name, :last_name, :description, :picture) 
p.merge!(params.permit(:remove_picture)) 

Вы просто создаете проблемы для себя.

+0

Спасибо за длинный ответ, но я понял, что моя проблема другая. Моя загрузка изображений работает нормально, но когда я нажимаю «добавить аватар», не выбирая прикрепляемый файл, я получаю «параметр отсутствует или значение пусто: пользователь». Только отправленные параметры - utf8, method, authenticity_token, commit, id (но id без ключа пользователя). Я назначил перенаправление в своем контроллере, но он работает только тогда, когда «пользователь» не требуется. Я должен найти способ не требовать пользователя, но требуя его в одно и то же время ... – Jes

+1

Вы можете использовать 'params.fetch (: user, {}). Allow (: a,: b,: c)'. Но вы должны просто взглянуть на примеры в readme и правильно вложить эти входы. Вероятно, это проблема [XY] (http://xyproblem.info/), в которой ваша форма испорчена, но вы чрезмерно сконцентрированы на использовании сильных параметров для предотвращения этой проблемы. Конечным результатом является несогласованный API. Если вы не можете заставить его работать, добавьте вашу форму и контроллер на вопрос. – max

Смежные вопросы