ActiveModel :: ForbiddenAttributesError rspec по запросу post [duplicate]

Независимо от того, что вы делаете, его можно «декомпилировать». Черт, вы можете просто разобрать его. Или посмотрите на дамп памяти, чтобы найти свои константы. Вы видите, что компьютер должен знать их, поэтому ваш код тоже понадобится.

Что делать с этим?

Попытайтесь не отправлять ключ в виде жестко запрограммированной константы в своем code: Храните его как настройку для каждого пользователя. Заставьте пользователя отвечать за этот ключ.

205
задан Vertexwahn 4 March 2016 в 17:46
поделиться

7 ответов

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

Возможно, вы захотите сделать это следующим образом:

class UsersController < ApplicationController

  def create
    @user = User.new(user_params)
    # ...
  end

  private

  def user_params
    params.require(:user).permit(:username, :email, :password, :salt, :encrypted_password)
  end
end
372
ответ дан Domon 16 August 2018 в 07:54
поделиться
  • 1
    Есть ли какая-либо документация о том, почему это работает или почему это необходимо? – DiverseAndRemote.com 9 August 2013 в 14:23
  • 2
    @OmarJackman Функциональность обеспечивается жемчугом strong_parameter. Он описан в руководствах Rails: guide.rubyonrails.org/… . – Domon 9 August 2013 в 18:28
  • 3
    Люди могут испытывать это, если они используют CanCan с Rails 4.0. Попробуйте AntonTrapps довольно чистое решение обходного решения до тех пор, пока CanCan не будет обновлен. – mjnissim 31 August 2013 в 10:06
  • 4
    @mjnissim Не могли бы вы разместить это как отдельный ответ? Я пропустил это в первый раз, но это все равно спасло мне массу времени. – Paul Pettengill 6 September 2013 в 19:27
  • 5
    @Domon Работал отлично. – Michael Roberts 28 February 2015 в 18:54

Для тех, кто использует CanCanCan:

Вы получите эту ошибку, если CanCanCan не сможет найти правильный метод params.

Для действия :create CanCan попытается инициализировать новый экземпляр с дезинфицированным вводом, если ваш контроллер будет реагировать на следующие методы (по порядку):

  1. create_params
  2. <model_name>_params, например article_params (это
  3. resource_params (универсальный метод, который вы могли бы указать в каждом контроллере)

Кроме того, load_and_authorize_resource теперь можно использовать возьмите опцию param_method, чтобы указать пользовательский метод в контроллере для запуска для дезинфекции ввода.

Вы можете связать параметр param_method с символом, соответствующим имени метода, который будет вызван:

class ArticlesController < ApplicationController
  load_and_authorize_resource param_method: :my_sanitizer

  def create
    if @article.save
      # hurray
    else
      render :new
    end
  end

  private

  def my_sanitizer
    params.require(:article).permit(:name)
  end
end

источник: https://github.com/CanCanCommunity/cancancan#strong-parameters

8
ответ дан Andreas 16 August 2018 в 07:54
поделиться

В качестве альтернативы вы можете использовать gem Protected Attributes gem , однако это наносит ущерб требованию сильных параметров. Однако, если вы обновляете более старое приложение, защищенные атрибуты предоставляют простой путь для обновления до тех пор, пока вы не сможете реорганизовать attr_accessible на сильные параметры.

3
ответ дан Brian Dear 16 August 2018 в 07:54
поделиться

hello в моем случае ошибка исправлена, но получение пустого результата - это база данных.

 def create
@worklog = Worklog.new(user_params)
@worklog.day = Date.today
@worklog.week = Date.today.strftime("%W").to_i
@worklog.author = User.current
@worklog.save
redirect_to worklogs_path()
 end

 def user_params
params.require(:worklog).permit(:utf8, :authenticity_token, {:worklog => [:typee, :do, :todo, :feel, :plan_done, :plan, :week_feel, :score, :good, :nogood]}, :commit)

}

Мой оригинальный плагин - https://github.com/ IceskYsl / worklogs

-1
ответ дан Dipen Patel 16 August 2018 в 07:54
поделиться

Если вы используете ActiveAdmin, не забывайте, что в блоке регистров модели есть также allow_params:

ActiveAdmin.register Api::V1::Person do
  permit_params :name, :address, :etc
end

Они должны быть установлены вместе с контроллерами:

def api_v1_person_params
  params.require(:api_v1_person).permit(:name, :address, :etc)
end

В противном случае вы получите сообщение об ошибке:

ActiveModel::ForbiddenAttributesError
19
ответ дан StuR 16 August 2018 в 07:54
поделиться

Существует более простой способ избежать сильных параметров вообще, вам просто нужно преобразовать параметры в обычный хеш, как:

unlocked_params = ActiveSupport::HashWithIndifferentAccess.new(params)

model.create!(unlocked_params)

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

22
ответ дан Wilker Lucio 16 August 2018 в 07:54
поделиться
  • 1
    Это именно то, что мне нужно. Благодаря! – Chris Scott 28 March 2016 в 15:29
  • 2
    Это также не сработало для меня, я слишком запутался прямо сейчас ... – Zia Ul Rehman Mughal 11 February 2018 в 18:22

Для тех, кто использует CanCan. Люди могут испытывать это, если они используют CanCan с Rails 4+. Попробуйте довольно чистое обходное решение AntonTrapps здесь до тех пор, пока CanCan не будет обновлен:

В ApplicationController:

before_filter do
  resource = controller_name.singularize.to_sym
  method = "#{resource}_params"
  params[resource] &&= send(method) if respond_to?(method, true)
end

и в контроллере ресурсов (например, NoteController):

private
def note_params
  params.require(:note).permit(:what, :ever)
end

Обновление:

Вот проект продолжения CanCan под названием CanCanCan, который выглядит многообещающим:

CanCanCan

62
ответ дан Will Richardson 16 August 2018 в 07:54
поделиться
  • 1
    Благодаря!! У меня вопрос, с CanCanCan (active) разрешен или не нужен этот код? – Adriano Resende 30 March 2016 в 19:42
Другие вопросы по тегам:

Похожие вопросы: