ForbiddenAttributesError с Grape и ActiveRecord

У меня есть приложение ruby, использующее Grape, и у него нет рельсов.

class Article < ActiveRecord::Base
end

class API::Articles < Grape::API
  post '/articles' do
    article = Article.create(params[:article])
  end
end

Article.create дает ActiveModel::ForbiddenAttributesError:

Об этом есть обсуждение здесь, но я этого не понимаю. Я пробовал это предложение:

post '/articles' do
  article = Article.create(permitted_params[:article])
  represent(article, env)
end

helpers do
  def permitted_params
    @permitted_params ||= declared(params, include_missing: false)
  end
end

На этот раз @permitted_params пусто, поэтому атрибуты исчезли.

Я также пытался обернуть хэш ActionController::Parameters, но это не помогло с другими ошибками.

Какое решение предлагается для решения ForbiddenAttributesError в Grape на данный момент?

Grape использует hashie gem для params и их решение для этого состоит в том, чтобы включить гем под названием hashie_rails, но этот гем приносит с собой все рельсы, а мне ничего из этого не нужно. Поэтому мне нужен ванильный раствор.


person user3995789    schedule 25.11.2014    source источник
comment
Если вы не хотите использовать гем Hashie, просто преобразуйте свой @permitted_params в хеш: @permitted_params ||= declared(params, include_missing: false).to_hash   -  person Yaro Holodiuk    schedule 13.05.2015


Ответы (2)


https://gist.github.com/smd686s/6320643

Gemfile

gem "actionpack", "~> 4.0.0"

app.rb

require 'rack/test'
require 'action_controller/metal/strong_parameters'

#https://github.com/rails/rails/blob/master/actionpack/test/controller/parameters/parameters_require_test.rb

module Application
  class API < Grape::API

    helpers do
      def item_params
        ActionController::Parameters.new(params).require(:item).permit(:attribute)
      end
    end

    desc "Create an item."
    post :items do
      Item.new item_params
    end
  end
end
person user3995789    schedule 25.11.2014

Вам нужно использовать гем hashie-forbidden_attributes, как указано в документация по винограду:

Кроме того, если версия вашего Rails 4.0+ и приложение использует уровень модели ActiveRecord по умолчанию, вам следует использовать гем hashie-forbidden_attributes. Этот драгоценный камень отключает функцию безопасности strong_params на уровне модели, позволяя вместо этого использовать собственную проверку параметров Grape.

person Tyler Collier    schedule 17.05.2016